Submission #891852

#TimeUsernameProblemLanguageResultExecution timeMemory
891852aliarapovJail (JOI22_jail)C++17
61 / 100
5064 ms48720 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> #define int long long #define pb push_back #define ff first #define ss second #define all(v) v.begin(), v.end() #define rall(v) v.rbegin(), v.rend() #define ordered_set tree<ll, null_type, less<ll>, rb_tree_tag, tree_order_statistics_node_update> #define ordered_multiset tree<type1, null_type, less_equal<type1>, rb_tree_tag, tree_order_statistics_node_update>; using namespace std; using namespace __gnu_pbds; const int mod = 1e9+7; const double PI = acos(-1.0); const double epsilon = 1e-6; const int N = 1.2e5+5; vector<int> g[N]; int sz[N], d[N], h[N], up[20][N]; int top[N], chain[N], tin[N], tout[N], rt, timer; void clean(){ d[1] = 0; for(int i = 1; i < N; i++){ g[i].clear(); for(int j = 0; j < 20; j++) up[j][i] = 0; } } struct SegmentTree{ int tree[N * 4]; int lazy[N * 4]; void push(int v, int tl, int tr) { if (lazy[v] == 0) return; if (tl != tr) { lazy[v * 2] += lazy[v]; lazy[v * 2 + 1] += lazy[v]; } tree[v] += lazy[v]; lazy[v] = 0; } void update(int l, int r, int x, int v, int tl, int tr) { push(v, tl, tr); if (l > tr || tl > r) return ; if (l <= tl && tr <= r) { lazy[v] = x; push(v, tl, tr); return; } int tm = (tl + tr) / 2; update(l, r, x, v * 2, tl, tm); update(l, r, x, v * 2 + 1, tm + 1, tr); tree[v] = tree[v * 2] + tree[v * 2 + 1]; } int get(int v, int tl, int tr, int l, int r) { push(v, tl, tr); if (l > tr || tl > r) return 0; if (l <= tl && tr <= r)return tree[v]; int tm = (tl + tr) / 2; return get(v * 2, tl, tm, l, r) + get(v * 2 + 1, tm + 1, tr, l, r); } void clean(){ for(int i = 0; i < N * 4; i++) tree[i] = 0,lazy[i] = 0; } }; SegmentTree seg; void dfs(int u, int p){ up[0][u] = p; for ( int i = 1; i < 20; i++ ){ up[i][u] = up[i - 1][up[i - 1][u]]; } sz[u] = 1; for ( auto &v: g[u] ){ if ( v != p ){ d[v] = d[u] + 1; dfs(v, u); sz[u] += sz[v]; } } for ( auto &v: g[u] ){ if ( v != p ){ if ( h[u] == -1 || sz[h[u]] < sz[v] ){ h[u] = v; } } } } int lca(int u, int v){ if ( d[u] < d[v] ) swap(u, v); int df = d[u] - d[v]; for ( int i = 0; i < 20; i++ ){ if ( df >> i & 1 ){ u = up[i][u]; } } if ( u == v ){ return u; } for ( int i = 19; i >= 0; i-- ){ if ( up[i][u] != up[i][v] ){ u = up[i][u]; v = up[i][v]; } } return up[0][u]; }; void HLD(int u, int p){ tin[u] = ++timer; chain[u] = rt; if ( top[rt] == -1 ){ top[rt] = u; } if ( h[u] != -1 ) HLD(h[u], u); for ( auto &v: g[u] ){ if ( v != p && h[u] != v ){ rt++; HLD(v, u); } } tout[u] = timer; } void upd(int u,int v,int val){ if ( d[u] < d[v] ) swap(u, v); while ( chain[u] != chain[v] ){ int nxt = top[chain[u]]; seg.update(tin[nxt],tin[u],val,1,1,N); u = up[0][nxt]; } seg.update(tin[v],tin[u],val,1,1,N); } void update(int u,int v, int val){ int lc = lca(u,v); upd(u,lc,val); upd(v,lc,val); seg.update(tin[lc],tin[lc],-val,1,1,N); } void solve(){ int n; cin >> n; for(int i = 1; i < n; i++){ int u,v; cin >> u >> v; g[u].pb(v); g[v].pb(u); } int m; cin >> m; vector<pair<int,int> > qr(m); for(auto &[l,r] : qr) cin >> l >> r; seg.clean(); for(int i = 0; i < N; i++) top[i] = -1, h[i] = -1; rt = 0; timer = 0; dfs(1,1); HLD(1,1); for(auto [u,v] : qr) update(u,v,1); vector<int> cnt(m); for(int i = 0; i < m; i++){ for(int j = 0; j < m; j++){ if(i == j) continue; auto [u,v] = qr[i]; int goal = qr[j].ff; int lc = lca(u,v); if(((tin[goal] <= tin[u] && tout[u] <= tout[goal]) || (tin[goal] <= tin[v] && tout[v] <= tout[goal])) && (tin[lc] <= tin[goal] && tout[goal] <= tout[lc])) cnt[i]++; } } vector<int> vis(m); for(int time = 0; time < m; time++){ bool ok = 0; int ind = 0; for(int i = 0; i < m; i++){ if(vis[i]) continue; auto [u,v] = qr[i]; update(u,v,-1); if(cnt[i] == 0 && seg.get(1,1,N,tin[v],tin[v]) == 0){ vis[i] = 1; ok = 1; ind = i; break; }else{ update(u,v,1); } } if(!ok){ cout << "No\n"; clean(); return; } for(int i = 0; i < m; i++){ auto [u,v] = qr[i]; int goal = qr[ind].ff; int lc = lca(u,v); if(((tin[goal] <= tin[u] && tout[u] <= tout[goal]) || (tin[goal] <= tin[v] && tout[v] <= tout[goal])) && (tin[lc] <= tin[goal] && tout[goal] <= tout[lc])) cnt[i]--; } } cout << "Yes\n"; clean(); } main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int tt = 1; cin >> tt; while (tt--) { solve(); } }

Compilation message (stderr)

jail.cpp:215:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
  215 | main(){
      | ^~~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...