Submission #705388

#TimeUsernameProblemLanguageResultExecution timeMemory
705388bin9638Sorting (IOI15_sorting)C++17
0 / 100
5 ms4436 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define fs first #define sc second #define N 1000010 #define pb push_back #define ii pair<ll,ll> int a[N],ktr[N],f[N],pos[N]; vector<ii>tv; void DFS(int u) { ktr[u]=1; if(ktr[a[u]]==0) DFS(a[u]); } int findSwapPairs(int n, int s[], int m, int x[], int y[], int p[], int q[]) { int res=0,l=0,r=m; while(l<=r) { int mid=(l+r)/2; // cout<<mid<<endl; for(int i=0;i<n;i++) a[i]=s[i]; for(int i=0;i<mid;i++) swap(a[x[i]],a[y[i]]); memset(ktr,0,sizeof(ktr)); int cnt=n; for(int i=0;i<n;i++) if(ktr[i]==0) { cnt--; DFS(i); } if(cnt<=mid) { r=mid-1; res=mid; for(int i=0;i<n;i++) f[i]=a[i]; }else l=mid+1; } //for(int i=0;i<n;i++)cout<<f[i]<<" ";cout<<endl; res=m; for(int i=0;i<n;i++) pos[f[i]]=i; for(int i=0;i<n;i++) if(f[i]!=i) { int t=f[i]; //cout<<i<<" "<<t<<endl; tv.pb({i,t}); swap(f[i],f[pos[i]]); swap(pos[i],pos[t]); } //for(int i=0;i<n;i++)cout<<f[i]<<" ";cout<<endl; for(int i=0;i<n;i++) { a[i]=s[i]; pos[a[i]]=i; } for(int i=0;i<res;i++) { if(i+1>tv.size()) { p[i]=x[i]; q[i]=y[i]; continue; } swap(a[x[i]],a[y[i]]); swap(pos[a[x[i]]],pos[a[y[i]]]); int u=pos[tv[i].fs],v=pos[tv[i].sc]; p[i]=u; q[i]=v; swap(a[u],a[v]); swap(pos[a[u]],pos[a[v]]); } #ifdef SKY for(int i=0;i<res;i++)cout<<p[i]<<" "<<q[i]<<endl; for(int i=0;i<n;i++)cout<<a[i]<<" ";cout<<endl; #endif // SKY return res; } #ifdef SKY int main() { freopen("A.inp","r",stdin); freopen("A.out","w",stdout); int n; cin>>n; int s[n]; for(int i=0;i<n;i++) cin>>s[i]; int m; cin>>m; int x[m],y[m],p[m],q[m]; for(int i=0;i<m;i++) { cin>>x[i]>>y[i]; // cout<<x[i]<<" "<<y[i]<<endl; } cout<<findSwapPairs(n,s,m,x,y,p,q); return 0; } #endif // SKY

Compilation message (stderr)

sorting.cpp: In function 'int findSwapPairs(int, int*, int, int*, int*, int*, int*)':
sorting.cpp:71:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   71 |         if(i+1>tv.size())
      |            ~~~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...