제출 #1244402

#제출 시각아이디문제언어결과실행 시간메모리
1244402Zbyszek99Comparing Plants (IOI20_plants)C++20
0 / 100
8 ms12616 KiB
#include "plants.h" #include <bits/stdc++.h> #define ll long long #define ld long double #define ff first #define ss second #define pii pair<int,int> #define pll pair<long long, long long> #define vi vector<int> #define vl vector<long long> #define pb push_back #define rep(i, b) for(int i = 0; i < (b); ++i) #define rep2(i,a,b) for(int i = a; i <= (b); ++i) #define rep3(i,a,b,c) for(int i = a; i <= (b); i+=c) #define count_bits(x) __builtin_popcountll((x)) #define all(x) (x).begin(),(x).end() #define siz(x) (int)(x).size() #define forall(it,x) for(auto& it:(x)) using namespace std; const int INF = 1e9+50; const ll INF_L = 1e18+40; const ll MOD = 1e9+7; const int tree_siz = 1024*512-1; struct add_min_tree { pii drzewo[tree_siz+1]; int oper[tree_siz+1]; add_min_tree() { rep2(i,tree_siz/2+1,tree_siz) { drzewo[i] = {0,i-(tree_siz/2+1)}; } for(int i = tree_siz/2; i >= 1; i--) { drzewo[i] = min(drzewo[i*2],drzewo[i*2+1]); } rep(i,tree_siz+1) { oper[i] = 0; } } void spych(int v) { drzewo[v*2].ff += oper[v]; oper[v*2] += oper[v]; drzewo[v*2+1].ff += oper[v]; oper[v*2+1] += oper[v]; oper[v] = 0; } void add_seg(int akt, int p1, int p2, int s1, int s2, int w) { if(p2 < s1 || p1 > s2) return; if(p1 >= s1 && p2 <= s2) { drzewo[akt].ff += w; oper[akt] += w; return; } spych(akt); add_seg(akt*2,p1,(p1+p2)/2,s1,s2,w); add_seg(akt*2+1,(p1+p2)/2+1,p2,s1,s2,w); drzewo[akt] = min(drzewo[akt*2],drzewo[akt*2+1]); } pii get_min(int akt, int p1, int p2, int s1, int s2) { if(p2 < s1 || p1 > s2) return {1e9,1}; if(p1 >= s1 && p2 <= s2) return drzewo[akt]; spych(akt); return min(get_min(akt*2,p1,(p1+p2)/2,s1,s2),get_min(akt*2+1,(p1+p2)/2+1,p2,s1,s2)); } }; add_min_tree RTree; add_min_tree distTree; set<int> zero; int n,k; vi r; vi h; void add_zero(int ind) { if(siz(zero) == 0) { zero.insert(ind); distTree.add_seg(1,0,tree_siz/2,ind,ind,-1e9); return; } auto prv = zero.lower_bound(ind); if(prv == zero.begin()) prv = zero.end(); prv--; distTree.add_seg(1,0,tree_siz/2,*prv,*prv,-distTree.get_min(1,0,tree_siz/2,*prv,*prv).ff - ((ind - *prv + n) % n)); prv++; if(prv == zero.end()) prv = zero.begin(); distTree.add_seg(1,0,tree_siz/2,ind,ind,-(*prv - ind + n) % n); zero.insert(ind); } void del_zero(int ind) { zero.erase(zero.find(ind)); distTree.add_seg(1,0,tree_siz/2,ind,ind,2e9); int l = (ind-k+1+n) % n; int r = (ind-1+n) % n; if(l <= r || ind == 0) { if(l > r) swap(l,r); RTree.add_seg(1,0,tree_siz/2,l,r,-1); } else { RTree.add_seg(1,0,tree_siz/2,0,r,-1); RTree.add_seg(1,0,tree_siz/2,l,n-1,-1); } if(siz(zero) > 0) { auto nxt = zero.lower_bound(ind); if(nxt == zero.end()) nxt = zero.begin(); int nxt_ = *nxt; if(nxt == zero.begin()) nxt = zero.end(); nxt--; int prv_ = *nxt; if(prv_ == nxt_) distTree.add_seg(1,0,tree_siz/2,nxt_,nxt_,-1e7); else distTree.add_seg(1,0,tree_siz/2,prv_,prv_,-distTree.get_min(1,0,tree_siz/2,prv_,prv_).ff + (nxt_-prv_+n) % n); } } void updRtree() { pii min_ = RTree.get_min(1,0,tree_siz/2,0,n-1); while(min_.ff == 0) { add_zero(min_.ss); RTree.add_seg(1,0,tree_siz/2,min_.ss,min_.ss,1e9); min_ = RTree.get_min(1,0,tree_siz/2,0,n-1); } } vi gen_any() { h.resize(n); rep(i,n) RTree.add_seg(1,0,tree_siz/2,i,i,r[i]); int cur = n-1; updRtree(); while(cur >= 0) { pii z = distTree.get_min(1,0,tree_siz/2,0,n-1); h[z.ss] = cur--; del_zero(z.ss); updRtree(); } return h; } void init(int K, vi R) { k = K; r = R; n = siz(r); gen_any(); return; } int compare_plants(int x, int y) { if(h[x] > h[y]) return 1; else return -1; return 0; }
#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...