Submission #640462

#TimeUsernameProblemLanguageResultExecution timeMemory
640462Urvuk3Xor Sort (eJOI20_xorsort)C++17
0 / 100
1 ms340 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long const int INF=1e9; const ll LINF=1e18; #define fi first #define se second #define pii pair<int,int> #define mid ((l+r)/2) #define sz(a) (int((a).size())) #define all(a) a.begin(),a.end() #define endl "\n" #define PRINT(x) cerr<<#x<<'='<<x<<endl; #define pb push_back #define PRINTvec(niz) { cerr<<#niz<<"="; for(auto _i:niz) cerr<<_i<<" "; cerr<<endl; } void Solve(){ int N,S; cin>>N>>S; vector<int> a(N+1); for(int i=1;i<=N;i++) cin>>a[i]; set<int> s; vector<pii> opers; function<void(int,int)> Oper=[&](int i,int j){ a[i]=a[i]^a[j]; opers.pb({i,j}); }; function<bool(int,int)> Has=[&](int x,int bit){ return (x&(1<<bit))>0; }; function<void(int,int,int)> Update=[&](int i,int j,int bit){ if(!Has(a[i],bit) && s.count(i)) s.erase(i); if(!Has(a[j],bit) && s.count(j)) s.erase(j); if(Has(a[i],bit)) s.insert(i); if(Has(a[j],bit)) s.insert(j); }; int L=1,R=N; if(S==2){ for(int bit=20;bit>=0;bit--){ s.clear(); bool pomeren=false; for(int i=L;i<=R;i++){ if(Has(a[i],bit)){ s.insert(i); } } while(!s.empty() && !(sz(s)==1 && s.count(L))){ int i=*(prev(s.end())); if(Has(a[i-1],bit)){ Oper(i,i-1); Update(i-1,i,bit); } else{ Oper(i-1,i); Update(i-1,i,bit); Oper(i,i-1); Update(i-1,i,bit); } } if(pomeren) ++L; } } else{ for(int bit=20;bit>=0;bit--){ s.clear(); bool pomeren=false; for(int i=L;i<=R;i++){ if(Has(a[i],bit)){ s.insert(i); pomeren=true; } } while(!s.empty() && !(sz(s)==1 && s.count(R))){ int i=*(s.begin()); if(Has(a[i+1],bit)){ Oper(i,i+1); Update(i,i+1,bit); } else{ Oper(i+1,i); Update(i,i+1,bit); Oper(i,i+1); Update(i,i+1,bit); } } if(pomeren) --R; } } cout<<sz(opers)<<endl; for(auto p:opers) cout<<p.fi<<" "<<p.se<<endl; //PRINTvec(a); } int main(){ ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int t; //cin>>t; t=1; while(t--){ Solve(); } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...