n为M二进制保留最高位,分开2部分来异或,大于等于n的 和 小于n的。
#include<cstdio> #include<iostream> #include<cstring> #include<string> #include<vector> #include<algorithm> #include<time.h> #include<stdlib.h> #include<cmath> using namespace std; int batt[100005]; int main() { int N,M; while(scanf("%d%d",&N,&M)!=EOF) { int a[2]; a[0]=a[1]=0; int ans=0; for(int i=0;i<N;i++) { scanf("%d",&batt[i]); if(i<2) { ans^=batt[i]; a[i]=batt[i]; } } sort(batt,batt+N); int flag=0;int k=0,b=1; int m=ceil(log((double)M)); m=1<<m; for(int i=0;i<N;i++) { if(batt[i]>=m) {k=i;break;} } for(int i=0;i<k&&b;i++) { for(int j=k;j<N;j++) { if((batt[i]^batt[j])>M) {flag=1;b=0;break;} } } if(flag) puts("YES"); else puts("NO"); } return 0; }
csu1323
最新推荐文章于 2021-03-27 10:45:08 发布