Submission #527429

#TimeUsernameProblemLanguageResultExecution timeMemory
527429qwerasdfzxclComparing Plants (IOI20_plants)C++14
44 / 100
4026 ms22852 KiB
#include "plants.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; const int INF = 1e9; int n, a[200200], b[200200], idxa[200200], idxb[200200]; struct Seg2{ pair<int, int> tree[800800]; int lazy[800800]; void init(int i, int l, int r){ lazy[i] = 0; if (l==r) {tree[i] = {INF, l}; return;} int m = (l+r)>>1; init(i<<1, l, m); init(i<<1|1, m+1, r); tree[i] = min(tree[i<<1], tree[i<<1|1]); } void propagate(int i, int l, int r){ tree[i].first += lazy[i]; if (l!=r) lazy[i<<1] += lazy[i], lazy[i<<1|1] += lazy[i]; lazy[i] = 0; } void update(int i, int l, int r, int s, int e, int x){ propagate(i, l, r); if (r<s || e<l) return; if (s<=l && r<=e){ lazy[i] += x; propagate(i, l, r); return; } int m = (l+r)>>1; update(i<<1, l, m, s, e, x); update(i<<1|1, m+1, r, s, e, x); tree[i] = min(tree[i<<1], tree[i<<1|1]); } void update2(int i, int l, int r, int s, int x){ propagate(i, l, r); if (r<s || s<l) return; if (l==r) {tree[i].second = x; return;} int m = (l+r)>>1; update2(i<<1, l, m, s, x); update2(i<<1|1, m+1, r, s, x); tree[i] = min(tree[i<<1], tree[i<<1|1]); } void update(int l, int r, int x){ if (r<=n) update(1, 1, n, l, r, x); else{ update(1, 1, n, l, n, x); update(1, 1, n, 1, r-n, x); } } }tree2; struct Seg1{ int tree[800800], lazy[800800]; void init(int i, int l, int r, vector<int> &vec){ lazy[i] = 0; if (l==r) {tree[i] = vec[l-1]; return;} int m = (l+r)>>1; init(i<<1, l, m, vec); init(i<<1|1, m+1, r, vec); tree[i] = max(tree[i<<1], tree[i<<1|1]); } void propagate(int i, int l, int r){ tree[i] += lazy[i]; if (l!=r) lazy[i<<1] += lazy[i], lazy[i<<1|1] += lazy[i]; lazy[i] = 0; } void update(int i, int l, int r, int s, int e, int x){ propagate(i, l, r); if (r<s || e<l) return; if (s<=l && r<=e){ lazy[i] += x; propagate(i, l, r); return; } int m = (l+r)>>1; update(i<<1, l, m, s, e, x); update(i<<1|1, m+1, r, s, e, x); tree[i] = max(tree[i<<1], tree[i<<1|1]); } void find(int i, int l, int r, int x){ propagate(i, l, r); if (tree[i]<x) return; if (l==r){ assert(tree[i]==x); //printf("YES: %d\n", l); tree2.update(l, l, -INF); tree2.update(l+1, l+x, 1); update(1, 1, n, l, l, -INF); return; } int m = (l+r)>>1; find(i<<1, l, m, x); find(i<<1|1, m+1, r, x); tree[i] = max(tree[i<<1], tree[i<<1|1]); } void update(int s, int e, int x){ if (s>0) update(1, 1, n, s, e, x); else{ update(1, 1, n, s+n, n, x); update(1, 1, n, 1, e, x); } } }tree1; vector<int> r; int k; void init(int K, vector<int> R) { k = K, r = R; n = r.size(); tree1.init(1, 1, n, r); tree2.init(1, 1, n); for (int i=1;i<=n;i++){ tree1.find(1, 1, n, k-1); assert(tree2.tree[1].first==0); a[i] = tree2.tree[1].second; //printf("a[%d] = %d\n", i, a[i]); tree2.update(a[i], a[i], INF); tree2.update(a[i]+1, a[i]+k-1, -1); tree1.update(a[i]-k+1, a[i]-1, 1); } //printf("A: "); //for (int i=1;i<=n;i++) printf("%d ", a[i]); //printf("\n"); for (int i=1;i<=n;i++) idxa[a[i]] = i; } int compare_plants(int x, int y) { ++x, ++y; if (n<=500){ tree1.init(1, 1, n, r); tree2.init(1, 1, n); if (idxa[x]>idxa[y]){ tree2.update2(1, 1, n, x, -INF+x); tree2.update2(1, 1, n, y, INF+y); } else{ tree2.update2(1, 1, n, x, INF+x); tree2.update2(1, 1, n, y, -INF+y); } for (int i=1;i<=n;i++){ tree1.find(1, 1, n, k-1); assert(tree2.tree[1].first==0); b[i] = tree2.tree[1].second; if (b[i]>=INF) b[i] -= INF; else if (b[i]<0) b[i] += INF; tree2.update(b[i], b[i], INF); tree2.update(b[i]+1, b[i]+k-1, -1); tree1.update(b[i]-k+1, b[i]-1, 1); } for (int i=1;i<=n;i++) idxb[b[i]] = i; if (idxa[x]>idxa[y] && idxb[x]>idxb[y]) return 1; if (idxa[x]<idxa[y] && idxb[x]<idxb[y]) return -1; return 0; } if (idxa[x]>idxa[y]) return 1; 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...