注意到:由于是按位与操作,所以选取的物品越多,结果是一定不会增的,而且,如果我们想让答案中这一位为1,一定要选取的所有数的这一位都为1才行,所以我们从高位开始构建结果,由于一个物品可以反复进行添加,他对结果是没有影响的,所以我们在枚举每一位的时候直接枚举所有的元素就行
#include <bits/stdc++.h>
#define int long long
using namespace std ;
signed main()
{
int n , k ; cin >> n >> k ;
vector<pair<int , int>>mp(n) ;
for(int i = 0 ; i < n ; i++)
{
cin >> mp[i].first >> mp[i].second ;
}
int c = 0 ;
for(int i = 30 ; i >= 0 ; i--)
{
int nc = c | (1LL << i) ;
bool found = false ;
int cur = -1 ;
for(int i = 0 ; i < n ; i++)
{
if((mp[i].second & nc) == nc)
{
if(!found)
{
cur = mp[i].first ;
found = true ;
}
else
{
cur &= mp[i].first ;
}
}
}
if(found && cur <= k)
{
c = nc ;
}
}
cout << c << endl ;
return 0 ;
}

京公网安备 11010502036488号