Submission #67825

#TimeUsernameProblemLanguageResultExecution timeMemory
67825yusufakePermutation Recovery (info1cup17_permutation)C++98
0 / 100
16 ms10068 KiB
#include<bits/stdc++.h> using namespace std; #define pb push_back typedef long long ll; typedef pair < int , int > pp; const int mod = 1e9 + 7; const int N = 1e5 + 5; typedef vector < int > vi; vector < int > s[N],A[N],x,y; ll pri[N],sz[N],lz[N],L[N],R[N],ans[N],uu; char u[N+N]; void put(int x){ if(!x) return; lz[x] = 1 - lz[x]; swap(L[x],R[x]); } void push(int x){ if(!lz[x]) return; lz[x] = 0; put(L[x]); put(R[x]); } vi top(vi a, vi b){ if(a.size() < b.size()) swap(a,b); int t,i,j,h=0; for(i=a.size()-1,j=b.size()-1 ; j>=0 ; i--,j--){ t = a[i]+b[j]+h; if(t >= 10) { h=1; t-=10; } a[i] = t; } if(h) { if(i>=0) a[i]++; else a.insert(a.begin() , 1); } return a; } vi cik(vi a, vi b){ int t,i,j,h=0; for(i=a.size()-1,j=b.size()-1 ; j >= 0; i--,j--){ t = a[i]-b[j]-h; if(t < 0) { h=1; t+=10; } a[i] = t; } if(h) a[i]--; for(; a.size()>1 && a[0] == 0 ;) a.erase(a.begin()); return a; } void relax(int x){ sz[x] = sz[ L[x] ] + sz[ R[x] ] + 1; s[x] = top(top(s[ L[x] ] , s[ R[x] ]) , A[x]); } int mrg(int x, int y){ if(!x) return y; if(!y) return x; if(pri[x] < pri[y]){ push(y); L[y] = mrg(x,L[y]); relax(y); return y; } else{ push(x); R[x] = mrg(R[x],y); relax(x); return x; } } bool g(vi &a, vi &b){ if(a.size() < b.size()) return 1; if(a.size() > b.size()) return 0; for(int i=0; i<a.size(); i++){ if(b[i] > a[i]) return 1; if(a[i] > b[i]) return 0; } return 1; } void split(int x, vector <int> k, int &a, int &b){ if(x == 0){ a = b = 0; return; } push(x); if(g(k,s[ L[x] ])){ split(L[x], k, a, b); L[x] = b; b = x; } else{ split(R[x], cik(k,top(s[ L[x] ],A[x])), a, b); R[x] = a; a = x; } relax(x); } void f(int x, int h){ if(x==0) return; push(x); f(L[x],h); ans[x] = h+sz[ L[x] ]+1; f(R[x],h+sz[ L[x] ]+1); } int main(){ ll n,i,j; vi bir,x,y,t; bir.pb(1); s[0].pb(0); y.pb(0); scanf("%lld",&n); int a,b,root = 0; srand(time(NULL)); for(i=1;i<=n;i++){ scanf(" %s", u); uu = strlen(u); x.clear(); for(j=0;j<uu;j++) x.pb(u[j]-'0'); t = cik(cik(x,y),bir); split(root, t, a, b); sz[i] = 1; pri[i] = rand(); s[i] = A[i] = cik(x,y); root = mrg( mrg(a,i) , b ); y = x; // return 0; } f(root,0); for(i=1;i<=n;i++) printf("%lld ",ans[i]); return 0; }

Compilation message (stderr)

permutation.cpp: In function 'bool g(vi&, vi&)':
permutation.cpp:75:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i=0; i<a.size(); i++){
                  ~^~~~~~~~~
permutation.cpp: In function 'int main()':
permutation.cpp:116:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%lld",&n);
     ~~~~~^~~~~~~~~~~
permutation.cpp:121:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf(" %s", u);
         ~~~~~^~~~~~~~~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...