Submission #1212004

#TimeUsernameProblemLanguageResultExecution timeMemory
1212004miss_robotThe Potion of Great Power (CEOI20_potion)C++20
35 / 100
3098 ms58104 KiB
#include <bits/stdc++.h> #pragma GCC optimize("O3") using namespace std; const int INF = 1e9, N = 2e5; int n, u, d, s4=1; int h[N], a[N], b[N], ans0[N], ans1[N], last0[N], last1[N]; set<int> g[N], e[N]; vector< pair<int, int> > iv0[N], iv1[N]; void init(int N, int D, int H[]){ n = N, d = D; for(int i = 0; i < n; i++) h[i] = H[i]; for(int i = 0; i < n; i++) if(h[i] > 1) s4 = 0; } void curseChanges(int U, int A[], int B[]){ u = U; for(int i = 0; i < u; i++) a[i] = A[i], b[i] = B[i]; if(!s4) return; for(int i = 0; i < u; i++){ if(e[a[i]].count(b[i])){ e[a[i]].erase(b[i]), e[b[i]].erase(a[i]); if(h[b[i]]){ if(!--ans1[a[i]]) iv1[a[i]].push_back({last1[a[i]], i}); } else{ if(!--ans0[a[i]]) iv0[a[i]].push_back({last0[a[i]], i}); } if(h[a[i]]){ if(!--ans1[b[i]]) iv1[b[i]].push_back({last1[b[i]], i}); } else{ if(!--ans0[b[i]]) iv0[b[i]].push_back({last0[b[i]], i}); } } else{ e[a[i]].insert(b[i]), e[b[i]].insert(a[i]); if(h[b[i]]){ if(!ans1[a[i]]++) last1[a[i]] = i+1; } else{ if(!ans0[a[i]]++) last0[a[i]] = i+1; } if(h[a[i]]){ if(!ans1[b[i]]++) last1[b[i]] = i+1; } else{ if(!ans0[b[i]]++) last0[b[i]] = i+1; } } } for(int i = 0; i < n; i++){ if(ans0[i]) iv0[i].push_back({last0[i], u}); if(ans1[i]) iv1[i].push_back({last1[i], u}); } } int dis(int a, int b){ return max(h[a], h[b]) - min(h[a], h[b]); } int st2(int X, int Y, int V){ int sol = INF; vector<int> cng; for(int i = 0; i < V; i++){ if(g[a[i]].count(b[i])) g[a[i]].erase(b[i]), g[b[i]].erase(a[i]); else g[a[i]].insert(b[i]), g[b[i]].insert(a[i]); cng.push_back(a[i]), cng.push_back(b[i]); } for(int x : g[X]) for(int y : g[Y]) sol = min(sol, dis(x, y)); while(!cng.empty()) g[cng.back()].clear(), cng.pop_back(); return sol; } int st4(int X, int Y, int V){ int x0 = 0, x1 = 0, y0 = 0, y1 = 0; pair<int, int> temp = {V,INF}; auto it0x = upper_bound(iv0[X].begin(), iv0[X].end(), temp); if(it0x != iv0[X].begin()){ it0x--; if(it0x->second >= V) x0 = 1; } auto it1x = upper_bound(iv1[X].begin(), iv1[X].end(), temp); if(it1x != iv1[X].begin()){ it1x--; if(it1x->second >= V) x1 = 1; } auto it0y = upper_bound(iv0[Y].begin(), iv0[Y].end(), temp); if(it0y != iv0[Y].begin()){ it0y--; if(it0y->second >= V) y0 = 1; } auto it1y = upper_bound(iv1[Y].begin(), iv1[Y].end(), temp); if(it1y != iv1[Y].begin()){ it1y--; if(it1y->second >= V) y1 = 1; } if((x0 && y0) || (x1 && y1)) return 0; if((x0 || x1) && (y0 || y1)) return 1; return INF; } int question(int X, int Y, int V){ if(s4) return st4(X, Y, V); return st2(X, Y, V); }
#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...