Submission #1175851

#TimeUsernameProblemLanguageResultExecution timeMemory
1175851mertbbmSorting (IOI15_sorting)C++20
100 / 100
128 ms14156 KiB
#include "sorting.h" #include <bits/stdc++.h> //#include "grader.cpp" using namespace std; //#define int long long #define ld long double #define show(x,y) cout << y << " " << #x << endl; #define show2(x,y,i,j) cout << y << " " << #x << " " << j << " " << #i << endl; #define show3(x,y,i,j,p,q) cout << y << " " << #x << " " << j << " " << #i << " " << q << " " << #p << endl; #define show4(x,y) for(auto it:y) cout << it << " "; cout << #x << endl; typedef pair<int,int>pii; mt19937_64 rng(chrono::system_clock::now().time_since_epoch().count()); struct DSU{ vector<int>e; void init(int n){ e=vector<int>(n,-1); } int get(int x){ return e[x]<0?x:e[x]=get(e[x]); } bool unite(int x, int y){ x=get(x); y=get(y); if(x==y) return 0; if(e[x]>e[y]) swap(x,y); e[x]+=e[y]; e[y]=x; return 1; } }; int arr[200005]; int n; int f(){ DSU dsu; dsu.init(n); for(int x=0;x<n;x++){ dsu.unite(x,arr[x]); } int cnt[n+5]; memset(cnt,0,sizeof(cnt)); int counter=0; for(int x=0;x<n;x++){ int hold=dsu.get(x); cnt[hold]++; if(cnt[hold]==1) counter++; } return counter; } int findSwapPairs(int N, int s[], int m, int a[], int b[], int p[], int q[]){ n=N; int pos[n]; for(int x=0;x<n;x++){ arr[x]=s[x]; pos[arr[x]]=x; } if(f()==n){ return 0; } int arr2[n]; for(int x=0;x<n;x++){ arr2[x]=arr[x]; } int l=0; int r=m-1; int mid; int best=r; int take=0; while(l<=r){ mid=(l+r)/2; while(take<=mid){ swap(arr[a[take]],arr[b[take]]); take++; } while(take-1>mid){ take--; swap(arr[a[take]],arr[b[take]]); } if(n-f()<=mid+1){ best=mid; r=mid-1; } else l=mid+1; } while(take<=best){ swap(arr[a[take]],arr[b[take]]); take++; } while(take-1>best){ take--; swap(arr[a[take]],arr[b[take]]); } //answer bool visited[n+5]; memset(visited,0,sizeof(visited)); int ptr=0; for(int y=0;y<n;y++){ if(visited[y]) continue; int cur=y; vector<int>v; while(1){ v.push_back(cur); visited[cur]=true; cur=arr[cur]; if(cur==y) break; } for(int i=(int)v.size()-2;i>=0;i--){ int temp=v.back(); int temp2=v[i]; swap(pos[arr2[a[ptr]]],pos[arr2[b[ptr]]]); swap(arr2[a[ptr]],arr2[b[ptr]]); p[ptr]=pos[temp]; q[ptr]=pos[temp2]; swap(pos[arr2[p[ptr]]],pos[arr2[q[ptr]]]); swap(arr2[p[ptr]],arr2[q[ptr]]); ptr++; } } while(ptr<best+1){ p[ptr]=q[ptr]=0; ptr++; } return best+1; }
#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...