제출 #1142841

#제출 시각아이디문제언어결과실행 시간메모리
1142841PagodePaiva식물 비교 (IOI20_plants)C++20
0 / 100
33 ms9540 KiB
#include<bits/stdc++.h> #include "plants.h" #define fr first #define sc second using namespace std; const int N = 200010; const int inf = 1e8; int k; int v[N]; struct Segtree{ pair <int, int> tree[4*N]; int lazy[4*N]; void unlazy(int node, int l, int r){ tree[node].first += lazy[node]; if(l != r){ lazy[2*node] += lazy[node]; lazy[2*node+1] += lazy[node]; } lazy[node] = 0; return; } pair <int, int> join(pair <int, int> a,pair <int, int> b){ if(a.fr > b.fr) return a; if(a.fr < b.fr) return b; if(a.sc < b.sc) return a; return b; } void build(int node, int l, int r){ if(l == r){ tree[node] = {v[l], l}; lazy[node] = 0; return; } int mid = (l+r)/2; build(2*node, l, mid); build(2*node+1, mid+1, r); tree[node] = join(tree[2*node], tree[2*node+1]); return; } void update(int node, int l, int r, int tl, int tr, int val){ unlazy(node, tl, tr); if(l <= tl and tr <= r){ lazy[node] += val; unlazy(node, tl, tr); return; } if(l > tr or tl > r) return; int mid = (tl+tr)/2; update(2*node, l, r, tl, mid, val); update(2*node+1, l,r , mid+1, tr, val); tree[node] = join(tree[2*node], tree[2*node+1]); return; } pair <int, int> query(int node, int l, int r, int tl, int tr){ unlazy(node, tl, tr); if(l > tr or tl > r) return {-inf, 0}; if(l <= tl and tr <= r) return tree[node]; int mid = (tl+tr)/2; return join(query(2*node, l, r, tl, mid), query(2*node+1, l,r , mid+1, tr)); } } seg; int tam; int res[N]; int n; void erase(int pos){ seg.update(1,pos, pos, 1, n, -inf); int r = pos; int l = pos-k+1; if(l > 0){ seg.update(1, l, r, 1, n, 1); } else{ seg.update(1, 1, r, 1, n, 1); l += n; seg.update(1, l, n, 1, n, 1); } } void init(int K, std::vector<int> r){ k = K; for(int i = 0;i < r.size();i++){ v[i+1] = k-r[i]-1; } n = r.size(); seg.build(1,1, n); tam = r.size(); while(tam > 0){ vector <int> maximos; pair <int, int> st = seg.query(1, 1, n, 1, n); maximos.push_back(st.second); while(true){ pair <int, int> nx = seg.query(1, maximos.back()+1, n, 1, n); if(nx.first != st.first) break; maximos.push_back(nx.second); } reverse(maximos.begin(), maximos.end()); set <int> s; for(auto x : maximos) s.insert(x); int best; for(auto x : maximos){ best = x; int l = max(1, x-k+1); auto it = s.lower_bound(l); int t = *it; if(t == x) break; } for(auto x : maximos){ //cout << x << ' '; if(x >= best){ res[x] = tam; tam--; erase(x); } } for(auto x : maximos){ if(x < best){ res[x] = tam; tam--; erase(x); } } } /*vector <int> debug; for(int i = 1;i <= n;i++){ debug.push_back(res[i]); } d(debug);*/ return; } int compare_plants(int x, int y) { if(res[x+1] < res[y+1]) 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...