Submission #1160565

#TimeUsernameProblemLanguageResultExecution timeMemory
1160565dwuyLong Mansion (JOI17_long_mansion)C++20
25 / 100
3087 ms67304 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); } pii get(int l, int r, int id, const int &u, const int &v, const int &lim){ if(l > v || r < u || tree[id].first > lim) return tree[0]; if(l == r){ pii p = tree[id]; tree[id] = {INF, INF}; return p; } int mid = (l + r)>>1; pii p = get(l, mid, id<<1, u, v, lim); return p.first != INF? p : get(mid + 1, r, id<<1|1, u, v, lim); } pii get(int l, int r, int lim){ return get(1, n, 1, l, r, lim); } }; 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++){ if(Q.size() && Q.top() <= i){ int u = trace[Q.top()]; Q.pop(); if(fr[u] > i){ pii e = smt.get(i + 1, fr[u], u); if(e.fi != INF){ trace[e.se] = u; Q.push(e.se); } } } pii e = smt.get(i + 1, min(n, fr[i - 1]), i - 1); if(e.fi != INF){ trace[e.se] = i- 1; Q.push(e.se); } 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...