제출 #891898

#제출 시각아이디문제언어결과실행 시간메모리
891898vjudge1Jail (JOI22_jail)C++17
66 / 100
5035 ms44128 KiB
/* author : abushbandit contest : --- */ #include "bits/stdc++.h" #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace __gnu_pbds; using namespace std; #define int long long #define all(x) x.begin(),x.end() #define rall(x) x.rbegin(),x.rend() #define ff first #define ss second #define pb push_back #define rep(i,s,f) for(int i = s;i < f;i++) #define ordered_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update> #pragma GCC optimize("Ofast,no-stack-protector,fast-math",3) template <class type1> using ordered_multiset = tree <type1, null_type, less_equal <type1>, rb_tree_tag, tree_order_statistics_node_update>; typedef long long ll; typedef long double ld; typedef vector<int> vi; typedef vector<pair<int,int>> vii; typedef pair<int,int> pii; template <class F, class _S> bool chmin(F &u, const _S &v){ bool flag = false; if ( u > v ){ u = v; flag |= true; } return flag; } template <class F, class _S> bool chmax(F &u, const _S &v){ bool flag = false; if ( u < v ){ u = v; flag |= true; } return flag; } int binpow (int a, int n) { int res = 1; while (n) { if (n & 1) res *= a; a *= a; n >>= 1; } return res; } void start_file(string file){ freopen((file + ".in").c_str(),"r",stdin); freopen((file + ".out").c_str(),"w",stdout); } 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; bool bamboo = 0; for(int i = 1; i < n; i++){ int u,v; cin >> u >> v; if(u == i && v == i + 1){ } else{ bamboo = 1; } g[u].pb(v); g[v].pb(u); } if(!bamboo){ vector<bool> used(n, 0); bool flag = 1; deque<pair<int, int>> l, r; int m; cin >> m; while (m--) { int s, t; cin >> s >> t; s--, t--; if (t > s) { r.push_back({t, s}); } else { l.push_back({t, s}); } used[s] = 1; } sort(all(l)), sort(all(r)); while (!l.empty()) { int s = l.front().second, t = l.front().first; l.pop_front(); used[s] = 0; while (s >= t) { if (used[s]) { flag = 0; break; } s--; } used[t] = 1; } while (!r.empty()) { int s = r.back().second, t = r.back().first; r.pop_back(); used[s] = 0; while (s <= t) { if (used[s]) { flag = 0; break; } s++; } used[t] = 1; } if(flag){ cout << "Yes\n"; } else{ cout << "No\n"; } return; } 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(); } }

컴파일 시 표준 에러 (stderr) 메시지

jail.cpp:327:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
  327 | main(){
      | ^~~~
jail.cpp: In function 'void start_file(std::string)':
jail.cpp:69:9: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   69 |  freopen((file + ".in").c_str(),"r",stdin);
      |  ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
jail.cpp:70:9: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   70 |  freopen((file + ".out").c_str(),"w",stdout);
      |  ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#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...