Submission #800365

#TimeUsernameProblemLanguageResultExecution timeMemory
800365I_Love_EliskaM_Comparing Plants (IOI20_plants)C++14
27 / 100
3268 ms12416 KiB
#include "plants.h" #include <bits/stdc++.h> using namespace std; #define forn(i,_n) for(int i=0;i<_n;++i) #define all(x) x.begin(),x.end() #define pb push_back #define pi pair<int,int> #define f first #define s second using ll = long long; const int N=2e5+55; int p[N]; int n; int k; struct sgt { vector<int> t,lazy; int sz=1; sgt(int n) { while (sz<n) sz<<=1; t.assign(2*sz,0); lazy.assign(4*sz,0); } void push(int v) { t[v]+=lazy[v]; lazy[2*v+1]+=lazy[v]; lazy[2*v+2]+=lazy[v]; lazy[v]=0; } void add(int v, int l, int r, int lx, int rx, int x) { if (lazy[v]) push(v); if (rx<=l || r<=lx) return; if (lx<=l && r<=rx) { lazy[v]+=x; push(v); return; } int m=(l+r)>>1; add(2*v+1,l,m,lx,rx,x); add(2*v+2,m,r,lx,rx,x); t[v]=max(t[2*v+1],t[2*v+2]); } void add(int l, int r, int x) { add(0,0,sz,l,r,x); } int query(int v, int l, int r, int lx, int rx) { if (lazy[v]) push(v); if (rx<=l || r<=lx) return -1e9-7; if (lx<=l && r<=rx) return t[v]; int m=(l+r)>>1; int lq=query(2*v+1,l,m,lx,rx); int rq=query(2*v+2,m,r,lx,rx); t[v]=max(t[2*v+1],t[2*v+2]); return max(lq,rq); } int query(int l, int r) { return query(0,0,sz,l,r); } }; sgt st(N); void init(int _k, vector<int> r) { k=_k; n=r.size(); if (2*k<=n) exit(0); vector<int> pos(k,-1); forn(i,n) st.add(i,i+1,r[i]); forn(i,n) { int l=0, r=n-1; while (l<r) { int mid=(l+r+1)>>1; int x=st.query(mid,n); if (x!=k-1) r=mid-1; else l=mid; } int z=r; l=0, r=k; while (l<r) { int mid=(l+r)>>1; int f=z-k+1; int x; if (f>=0) { x=st.query(f,f+mid+1); } else { if (f+mid+1>0) { x=max(st.query(f+n,n),st.query(0,f+mid+1)); } else { x=st.query(f+n,f+mid+1+n); } } if (x==k-1) r=mid; else l=mid+1; } z=z-k+1+r; if (z<0) z+=n; p[z]=i; st.add(z,z+1,-k); int f=z-k+1; if (f>=0) { st.add(f,z,1); } else { st.add(0,z,1); st.add(n+f,n,1); } } } int compare_plants(int x, int y) { if (p[x]>p[y]) return 1; else return -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...
#Verdict Execution timeMemoryGrader output
Fetching results...