結果
問題 | No.2024 Xer |
ユーザー |
![]() |
提出日時 | 2022-07-29 23:44:49 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 175 ms / 2,000 ms |
コード長 | 2,798 bytes |
コンパイル時間 | 1,940 ms |
コンパイル使用メモリ | 149,624 KB |
実行使用メモリ | 26,956 KB |
最終ジャッジ日時 | 2024-07-19 17:22:04 |
合計ジャッジ時間 | 6,178 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 47 |
ソースコード
#define _USE_MATH_DEFINES #include<iostream> #include<vector> #include<algorithm> #include<cmath> #include<string> #include<iomanip> #include<numeric> #include<queue> #include<deque> #include<stack> #include<set> #include<map> #include<random> #include<bitset> #include<cassert> using namespace std; typedef long long ll; const int mod=998244353; const int dx[]={1,0,0,-1},dy[]={0,1,-1,0}; int solve(vector<int>a,int x,bool f,int d){ if(a.size()==0&&f) return 3; if(a.size()<=1) return 1; if(d==0) return 0; if(x>>d-1&1){ if(f){ for(int i=0;i<a.size()-1;i++) if(~(a[i]^a[i+1])>>d-1&1) return 0; return solve(a,x&~(1<<d),1,d-1); }else{ vector<int>l,r; for(int i=0;i<a.size();i++) if(a[i]>>d-1&1) r.push_back(a[i]&~(1<<d)); else l.push_back(a[i]); if(abs((int)l.size()-(int)r.size())>1) return 0; vector<int>v; if(l.size()>=r.size()){ for(int i=0;i<l.size();i++){ v.push_back(l[i]); if(i<r.size()) v.push_back(r[i]); } }else{ for(int i=0;i<r.size();i++){ v.push_back(r[i]); if(i<l.size()) v.push_back(l[i]); } } return solve(v,x&~(1<<d),1,d-1)>=1; } }else{ if(f){ vector<int>l1,r1,l2,r2; for(int i=0;i<a.size();i+=2) if(a[i]>>d-1&1) r1.push_back(a[i]&~(1<<d)); else l1.push_back(a[i]); for(int i=1;i<a.size();i+=2) if(a[i]>>d-1&1) r2.push_back(a[i]&~(1<<d)); else l2.push_back(a[i]); if(abs((int)l1.size()-(int)l2.size())>1) return 0; if(abs((int)r1.size()-(int)r2.size())>1) return 0; vector<int>vl,vr; if(l1.size()>=l2.size()){ for(int i=0;i<l1.size();i++){ vl.push_back(l1[i]); if(i<l2.size()) vl.push_back(l2[i]); } }else{ for(int i=0;i<l2.size();i++){ vl.push_back(l2[i]); if(i<l1.size()) vl.push_back(l1[i]); } } if(r1.size()>=r2.size()){ for(int i=0;i<r1.size();i++){ vr.push_back(r1[i]); if(i<r2.size()) vr.push_back(r2[i]); } }else{ for(int i=0;i<r2.size();i++){ vr.push_back(r2[i]); if(i<r1.size()) vr.push_back(r1[i]); } } if(l1.size()>l2.size()){ if(r1.size()==r2.size()) return solve(vl,x,1,d-1)&solve(vr,x,1,d-1)>>1; else return solve(vl,x,1,d-1)&solve(vr,x,1,d-1); }else if(l1.size()<l2.size()){ return(solve(vl,x,1,d-1)&solve(vr,x,1,d-1))<<1; }else return solve(vl,x,1,d-1)&solve(vr,x,1,d-1); }else{ vector<int>l,r; for(int i=0;i<a.size();i++) if(a[i]>>d-1&1) r.push_back(a[i]&~(1<<d)); else l.push_back(a[i]); return solve(l,x,0,d-1)&solve(r,x,0,d-1); } } } int main(){ int n,x,a[200000]; cin>>n>>x; for(int i=0;i<n;i++) cin>>a[i]; sort(a,a+n); cout<<(solve(vector<int>(a,a+n),x,0,30)?"Yes":"No")<<endl; }