Submission #579991

#TimeUsernameProblemLanguageResultExecution timeMemory
579991Mr_HusanboyXor Sort (eJOI20_xorsort)C++14
100 / 100
11 ms1104 KiB
// Muallif: Mansuraliyev Husanboy Murotali o'g'li >> NamPS #include<bits/stdc++.h> using namespace std; #define ll long long #define ios ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL) #define all(a) a.begin(), a.end() #define F first #define S second struct segtree{ vector<int> t; int sz=0; void init(int n){ t.assign(4*n+1,0); sz=n; } void upd(int x, int l, int r, int ind, int val){ if(l==r){ t[x]=val;return; } int m=(l+r)/2; if(ind>m){ upd(x*2+1,m+1,r,ind,val); }else upd(x*2,l,m,ind,val); t[x]=t[x*2]^t[x*2+1]; } void upd(int ind, int val){ upd(1,1,sz,ind,val); } int get(int x, int l, int r, int lx, int rx){ if(lx<=l&&r<=rx){ return t[x]; } if(r<lx||rx<l){ return 0; } int m=(l+r)/2; return get(x*2,l,m,lx,rx)^get(x*2+1,m+1,r,lx,rx); } int get(int l,int r){ return get(1,1,sz,l,r); } }; segtree t; void solve(){ int n,s; cin>>n>>s; int a[n],b[n+1]; t.init(n); for(int i=0;i<n;i++) cin>>a[i]; for(int i=1;i<=n;i++) b[i]=a[i-1],t.upd(i,b[i]); vector<pair<int,int> > ans; int mx=1e9; if(s==1){//cout<<"doe"<<endl; for(int i=n;i>=1;i--){ int mx2=0,ind=0; for(int j=1;j<=i;j++){ int cur=t.get(j,i); if(cur>=mx) continue; if(cur>mx2) mx2=cur,ind=j; }//cout<<ind<<"\n"; if(ind==0){ // cout<<"wrong solution";return; for(int j=i;j<n&&b[j]>b[j+1];j++){ swap(b[j],b[j+1]); t.upd(j,b[j]); t.upd(j+1,b[j+1]); ans.push_back({j,j+1}); ans.push_back({j+1,j}); ans.push_back({j,j+1}); } //cout<<i<<' '; }else for(int j=ind; j<i;j++){ ans.push_back({j+1,j}); b[j+1]^=b[j]; t.upd(j+1,b[j+1]); } mx=b[i]; } //for(int i=1;i<=n;i++) cout<<b[i]<<' ';cout<<endl; cout<<ans.size()<<"\n"; for(auto u:ans){ cout<<u.F<<' '<<u.S<<"\n"; } return; } int done=0; bool ok=0; for(int i=19;i>=0;i--){ ok=0; for(int j=0;j<n-done-1;j++){ if(a[j]&(1<<i)){ ok=1; if(a[j+1]&(1<<i)){ ans.push_back({j,j+1}); a[j]^=a[j+1]; }else{ ans.push_back({j+1,j}); ans.push_back({j,j+1}); a[j+1]^=a[j]; a[j]^=a[j+1]; } } } done+=ok; } cout<<ans.size()<<"\n"; for(auto u:ans){ cout<<u.F+1<<' '<<u.S+1<<"\n"; } } int main(){ ios; //int t=1; cin>>t; while(t--) solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...