Submission #48068

#TimeUsernameProblemLanguageResultExecution timeMemory
48068jacobtplLibrary (JOI18_library)C++14
100 / 100
489 ms716 KiB
#include "library.h" #include <bits/stdc++.h> using namespace std; #define ll long long #define mp make_pair #define sz(x) (int)(x).size() #define all(x) (x).begin(),(x).end() #define pb push_back #define ii pair<int,int> #define INF 1000000000 #define INFLL 1000000000000000100ll #define UQ(x) (x).resize(distance((x).begin(),unique(all((x))))) #define mid(x,y) (((x)+(y))>>1) #define M 1000000007ll int n; int lquery(vector<int> v) { vector<int> m(n,0); for (int x:v) { m[x]=1; } return Query(m); } vector<vector<int> > v; int rquery(int i,int j) { vector<int> m(n,0); for (int k=i;k<=j;k++) { for (int x:v[k]) m[x]=1; } return Query(m); } int query2(int a,int b) { vector<int> m(n,0); m[a]=1; m[b]=1; return Query(m); } vector<int> merge(int a,int b) { vector<int> x; if (sz(v[a])==1 && sz(v[b])==1) { x.pb(v[a][0]); x.pb(v[b][0]); return x; } if (sz(v[a])>sz(v[b])) swap(a,b); if (sz(v[a])==1) { if (query2(v[a][0],v[b][0])==1) { x.pb(v[a][0]); for (int y:v[b]) x.pb(y); } else { //******* //assert(query2(v[a][0],v[b].back())==1); //******* for (int y:v[b]) x.pb(y); x.pb(v[a][0]); } return x; } if (query2(v[a][0],v[b][0])==1) { for (int y:v[a]) x.pb(y); reverse(all(x)); for (int y:v[b]) x.pb(y); } else if (query2(v[a].back(),v[b].back())==1) { for (int y:v[a]) x.pb(y); for (int i=sz(v[b])-1;i>=0;i--) x.pb(v[b][i]); } else if (query2(v[a][0],v[b].back())==1) { for (int y:v[a]) x.pb(y); reverse(all(x)); for (int i=sz(v[b])-1;i>=0;i--) x.pb(v[b][i]); } else { //******* //assert(query2(v[a].back(),v[b][0])==1); //******* for (int y:v[a]) x.pb(y); for (int y:v[b]) x.pb(y); } return x; } void Solve(int N) { n=N; for (int i=0;i<n;i++) { vector<int> x; x.pb(i); v.pb(x); } #ifdef DEBUG for (vector<int> x:v) { printf("{ "); for (int y:x) printf("%d ", y+1); printf("} "); } printf("\n"); #endif while(sz(v)>1) { int b=0,e=sz(v)-1; int idx=e; while(b<e+1) { int m=(b+e)/2; int r=rquery(0,m); if (r<(m+1)) { idx=min(idx,m); e=m-1; } else b=m+1; } b=0,e=idx; int idx2=0; while(b<e+1) { int m=(b+e)/2; int r=rquery(m,idx); if (r<(idx-m+1)) { idx2=max(idx2,m); b=m+1; } else e=m-1; } assert(idx2<idx); vector<int> x=merge(idx2,idx); v.erase(v.begin()+idx); v.erase(v.begin()+idx2); v.pb(x); #ifdef DEBUG for (vector<int> x:v) { printf("{ "); for (int y:x) printf("%d ", y+1); printf("} "); } printf("\n"); #endif } assert(sz(v)==1); assert(sz(v[0])==n); vector<int> res(n); for(int i = 0; i < n; i++) { res[i] = v[0][i]+1; } Answer(res); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...