Submission #527389

#TimeUsernameProblemLanguageResultExecution timeMemory
527389qwerasdfzxcl식물 비교 (IOI20_plants)C++14
44 / 100
714 ms21996 KiB
#include "plants.h" #include <bits/stdc++.h> using namespace std; typedef long long ll; const int INF = 1e9; int n, a[200200], idx[200200]; struct Seg2{ pair<int, int> tree[800800]; int lazy[800800]; void init(int i, int l, int r, int x = 1){ lazy[i] = 0; if (l==r) {tree[i] = {INF, l*x}; return;} int m = (l+r)>>1; init(i<<1, l, m, x); init(i<<1|1, m+1, r, x); 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 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; void init(int k, vector<int> 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++) idx[a[i]] = i; } int compare_plants(int x, int y) { ++x, ++y; if (idx[x]>idx[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...