Submission #578478

#TimeUsernameProblemLanguageResultExecution timeMemory
578478amunduzbaevThe Potion of Great Power (CEOI20_potion)C++17
38 / 100
3029 ms125472 KiB
#include "bits/stdc++.h" using namespace std; #ifndef EVAL #include "grader.cpp" #endif #define ar array const int N = 1e5 + 5; const int C = 35; vector<ar<int, 2>> edges[N]; vector<set<int>> vals[N]; vector<int> tim[N]; int h[N], n; void init(int N, int D, int H[]) { n = N; for(int i=0;i<N;i++){ h[i] = H[i]; } } void curseChanges(int U, int A[], int B[]) { set<ar<int, 2>> ss; for(int i=0;i<U;i++){ if(A[i] > B[i]) swap(A[i], B[i]); int t = 1; if(ss.count({A[i], B[i]})) t = -1; edges[A[i]].push_back({i + 1, (B[i] + 1) * t}); edges[B[i]].push_back({i + 1, (A[i] + 1) * t}); if(t == 1) ss.insert({A[i], B[i]}); else ss.erase({A[i], B[i]}); } for(int i=0;i<n;i++){ set<int> ss; for(int j=0;j<(int)edges[i].size();j++){ if(j % C == 0){ vals[i].push_back(ss); tim[i].push_back(edges[i][j][0]); } if(edges[i][j][1] < 0){ ss.erase(ss.find(-edges[i][j][1] - 1)); } else { ss.insert(edges[i][j][1] - 1); } } } //~ for(int i=0;i<n;i++){ //~ cout<<i<<"\n"; //~ for(auto x : edges[i]) cout<<x[0]<<" "<<x[1]<<"\n"; //~ cout<<"\n"; //~ } } set<int> get(int a, int t){ int j = upper_bound(tim[a].begin(), tim[a].end(), t) - tim[a].begin(); if(!j){ return {}; } j--; set<int> res = vals[a][j]; for(int k=j*C;k<(int)edges[a].size() && edges[a][k][0]<=t;k++){ if(edges[a][k][1] > 0){ res.insert(edges[a][k][1] - 1); } else { res.erase(res.find(-edges[a][k][1] - 1)); } } set<int> tt; for(auto x : res) tt.insert(h[x]); return tt; } int question(int x, int y, int v) { set<int> a = get(x, v); set<int> b = get(y, v); //~ for(auto x : a) cout<<x<<" "; //~ cout<<"\n"; //~ for(auto x : b) cout<<x<<" "; //~ cout<<"\n"; //~ int res = 1e9; //~ for(auto x : S[x]){ //~ auto it = S[y].lower_bound(x); //~ if(it != S[y].end()){ //~ res = min(res, *it - x); //~ } if(it != S[y].begin()){ //~ it--; //~ res = min(res, x - *it); //~ } //~ } //~ return res; auto lx = a.begin(), rx = b.begin(); int last = -1e9, f = -1, res = 1e9; while(lx != a.end() || rx != b.end()){ if(f == 0 && rx != b.end()) res = min(res, *rx - last); if(f == 1 && lx != a.end()) res = min(res, *lx - last); if(lx != a.end() && rx != b.end()){ if(*lx <= *rx) last = *lx, f = 0, lx++; else last = *rx, f = 1, rx++; } else break; } return res; } /* 6 5 11 4 2 42 1000 54 68 234 0 1 2 0 3 4 3 5 3 5 1 3 5 3 0 5 3 0 1 3 3 5 0 3 4 26 3 0 8 0 0 5 5 1000000000 3 0 11 14 */
#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...