Submission #721886

#TimeUsernameProblemLanguageResultExecution timeMemory
721886MDSProEvent Hopping (BOI22_events)C++14
0 / 100
55 ms3912 KiB
#include "bits/stdc++.h" using namespace std; struct DSU{ int n; vector<int> par,r; DSU(int sz):n(sz){ par.resize(n); iota(par.begin(),par.end(),0); r.assign(n,1); } int get(int x){ return par[x] = (x == par[x] ? x : get(par[x])); } void unite(int a, int b){ a = get(a); b = get(b); if(a == b) return; if(r[a] > r[b]) swap(a,b); r[b] += r[a]; par[a] = b; r[a] = 0; } }; int main(){ cin.tie(0)->sync_with_stdio(0); int n,q; cin >> n >> q; vector<tuple<int,int,int>> ev; for(int i = 0; i < n; ++i){ int x,y; cin >> x >> y; ev.emplace_back(y,x,i+1); } sort(ev.begin(),ev.end()); vector<int> nw_order(n+1); vector<int> left(n),right(n); for(int i = 0; i < n; ++i) { left[i] = get<1>(ev[i]); right[i] = get<0>(ev[i]); nw_order[get<2>(ev[i])] = i; } DSU dsu(n); for(int i = 0; i < n; ++i){ for(int j = max(0,i-1); j < min(n,i+2); ++j){ if(i == j) continue; if(left[j] <= right[i] && right[i] <= right[j]) dsu.unite(i,j); } } while(q--){ int a,b; cin >> a >> b; a = nw_order[a]; b = nw_order[b]; if(left[b] <= right[a] && right[a] <= right[b]) cout << 1; else if(dsu.get(a) == dsu.get(b)) cout << b-a; else cout << "impossible"; } }
#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...