Submission #1160567

#TimeUsernameProblemLanguageResultExecution timeMemory
1160567dwuyLong Mansion (JOI17_long_mansion)C++20
100 / 100
544 ms82328 KiB
/** - dwuy -       />  フ       |  _  _|       /`ミ _x ノ      /      |     /  ヽ   ?  / ̄|   | | |  | ( ̄ヽ__ヽ_)_)  \二つ **/ #include <bits/stdc++.h> #define fastIO ios_base::sync_with_stdio(false); cin.tie(NULL) #define file(a) freopen(a".inp","r",stdin); freopen(a".out", "w",stdout) #define fi first #define se second #define endl "\n" #define len(s) (int)((s).size()) #define MASK(k)(1LL<<(k)) #define TASK "test" using namespace std; typedef tuple<int, int, int> tpiii; typedef pair<double, double> pdd; typedef pair<int, int> pii; typedef long long ll; const long long OO = 1e18; const int MOD = 1e9 + 7; const int INF = 1e9; const int MX = 500005; struct SMT{ int n; vector<pii> tree; SMT(int n = 0) : n(n), tree(n<<2|3, {INF, INF}) {} void build(int l, int r, int id, int *a){ if(l == r){ tree[id] = {a[l], l}; return; } int mid = (l + r)>>1; build(l, mid, id<<1, a); build(mid+1, r, id<<1|1, a); tree[id] = min(tree[id<<1], tree[id<<1|1]); } void build(int *a){ build(1, n, 1, a); } void update(int pos, pii p){ int id = 1; for(int lo=1, hi=n; lo<hi;){ int mid = (lo + hi)>>1; if(pos <= mid) hi = mid, id = id<<1; else lo = mid + 1, id = id<<1|1; } tree[id] = p; for(id>>=1; id; id>>=1) tree[id] = min(tree[id<<1], tree[id<<1|1]); } int get(int pos, int lim){ int id = 1; for(int lo=1, hi=n; lo<hi;){ int mid = (lo + hi)>>1; if(tree[id<<1].fi <= lim) hi = mid, id = id<<1; else lo = mid + 1, id = id<<1|1; } pii p = {INF, INF}; if(tree[id].se <= pos && tree[id].fi <= lim) swap(p, tree[id]); for(id>>=1; id; id>>=1) tree[id] = min(tree[id<<1], tree[id<<1|1]); return p.se; } }; int n, q; int a[MX], s[MX], t[MX], vist[MX]; int fl[MX], fr[MX], ans[MX]; vector<int> b[MX]; namespace dwuy{ vector<int> qr[MX]; int trace[MX]; void build1(){ for(int i=1; i<=q; i++) if(s[i] < t[i]){ qr[s[i]].push_back(i); } } void build2(){ for(int i=0; i<MX; i++) qr[i].clear(); reverse(fl + 1, fl + n + 1); reverse(fr + 1, fr + n + 1); for(int i=1; i<=n; i++){ fl[i] = n - fl[i] + 1; fr[i] = n - fr[i] + 1; swap(fl[i], fr[i]); } fr[0] = n + 1; for(int i=1; i<=q; i++) if(s[i] > t[i]){ s[i] = n - s[i] + 1; t[i] = n - t[i] + 1; qr[s[i]].push_back(i); } } void solve(){ priority_queue<int, vector<int>, greater<int>> Q; SMT smt(n); smt.build(fl); for(int i=1; i<=n; i++){ smt.update(i, {INF, INF}); if(Q.size() && Q.top() <= i){ int u = trace[Q.top()]; Q.pop(); if(fr[u] > i){ int e = smt.get(fr[u], u); if(e != INF){ trace[e] = u; Q.push(e); } } } int e = smt.get(fr[i - 1], i - 1); if(e != INF){ trace[e] = i - 1; Q.push(e); } for(int j: qr[i]){ if(!Q.size() || t[j] < Q.top()) ans[j] = 1; } } } } int32_t main(){ fastIO; //file(TASK); cin >> n; cin.ignore(); string z; getline(cin, z); z += ' '; for(int i=0, j=1; i<len(z); i++) if(z[i] != ' '){ a[j] = a[j]*10 + z[i] - '0'; if(z[i + 1] == ' ') j++; } for(int i=1; i<=n; i++){ int d; cin >> d; b[i].resize(d); for(int &x: b[i]) cin >> x; } cin >> q; for(int i=1; i<=q; i++){ cin >> s[i] >> t[i]; } memset(vist, 0, sizeof vist); for(int i=1; i<=n; i++){ fl[i] = vist[a[i - 1]]; for(int x: b[i]) vist[x] = i; } memset(vist, 0, sizeof vist); for(int i=n; i>=1; i--){ fr[i] = vist[a[i]] == 0? n + 1 : vist[a[i]]; for(int x: b[i]) vist[x] = i; } fr[0] = n + 1; dwuy::build1(); dwuy::solve(); dwuy::build2(); dwuy::solve(); for(int i=1; i<=q; i++) cout << (ans[i]? "YES" : "NO") << endl; 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...