Submission #1299395

#TimeUsernameProblemLanguageResultExecution timeMemory
1299395sitingfake동기화 (JOI13_synchronization)C++20
100 / 100
178 ms19920 KiB
#include<bits/stdc++.h> using namespace std; // define #define execute cerr << " Time: " << fixed << setprecision(6) << (1.0 * clock() / CLOCKS_PER_SEC) << "s\n"; #define ll long long #define ii pair <int , int> #define iii pair <int , ii> #define se second #define fi first #define all(v) (v).begin() , (v).end() #define Unique(v) sort(all(v)) , v.resize(unique(all(v)) - v.begin()) #define bit(x,i) (((x) >> (i)) & 1LL) #define flip(x,i) ((x) ^ (1LL << (i))) #define ms(d,x) memset(d , x , sizeof(d)) #define exist __exist #define ends __ends #define visit visited #define left __left #define right __right #define prev __prev #define next __next #define sitingfake 1 #define orz 1 //constant const long long mod = 1e9 + 7; const long long linf = 4557430888798830399LL; const long long nlinf = -4485090715960753727LL; const int LOG = 20; const int inf = 1061109567; const int ninf = -1044266559; const int dx[] = {0 , -1 , 0 , 1}; const int dy[] = {-1 , 0 , 1 , 0}; template<typename T> bool maximize(T &a, const T &b) { if(a < b) {a = b; return 1;} return 0; } template<typename T> bool minimize(T &a, const T &b) { if(a > b) {a = b; return 1;} return 0; } void Plus(ll & a ,ll b) { b %= mod; a += b; if(a < 0) a += mod; a %= mod; return; } void Mul(ll & a, ll b) { (a *= (b % mod)) %= mod; return; } //code const int maxn = 1e5 + 7; int n , m , q; bool good[maxn]; int ans[maxn] , preVal[maxn]; ii edges[maxn]; vector <int> adj[maxn]; int heavy[maxn] , head[maxn]; int depth[maxn] , par[maxn]; int in[maxn] , id[maxn] , timer; int dfscount(int u , int p) { int cur = 1; int Max = 0; for(int v : adj[u]) { if(v != p) { par[v] = u; depth[v] = depth[u] + 1; int sz = dfscount(v , u); cur += sz; if(sz > Max) { Max = sz; heavy[u] = v; } } } return cur; } void HLD(int u , int p , int h) { head[u] = h; in[u] = ++timer; id[timer] = u; if(heavy[u]) { HLD(heavy[u] , u , h); } for(int v : adj[u]) { if(v != p && v != heavy[u]) { HLD(v , u , v); } } } int lca(int u , int v) { for(;head[u] != head[v]; v = par[head[v]]) { if(depth[head[u]] > depth[head[v]]) swap(u , v); } if(depth[u] > depth[v]) swap(u , v); return u; } // process int bit[maxn]; void up(int x , int val) { for(;x <= n; x += (x & -x)) bit[x] += val; } int get(int x) { int ans = 0; for(;x > 0; x -= (x & -x)) ans += bit[x]; return ans; } int query(int l , int r) { return get(r) - get(l - 1); } int findAcs(int cur) { while(par[cur]) { if(query(in[cur] , in[cur]) != 1) return cur; int p = head[cur]; int l = in[p] + 1 , r = in[cur]; if(query(l , r) != r - l + 1) { int left = l , right = r ,pos = -1; while(left <= right) { int mid = (right + left) >> 1; if(query(mid , r) == r - mid + 1) { pos = mid; right = mid - 1; } else left = mid + 1; } return id[pos - 1]; } if(query(in[p] , in[p]) != 1) return p; cur = par[p]; } return 1; } void update(int u , int v , int pos) { if(u == par[v]) swap(u , v); if(good[pos]) { int longestAcs = findAcs(u); ans[u] = preVal[u] = ans[longestAcs]; up(in[u] , -1); } else { up(in[u] , 1); int longestAcs = findAcs(u); ans[longestAcs] += ans[u] - preVal[u]; } good[pos] ^= 1; } void solve(void) { cin >> n >> m >> q; for(int i = 1; i < n; i++) { int u , v; cin >> u >> v; edges[i] = {u , v}; adj[u].push_back(v); adj[v].push_back(u); } dfscount(1 , -1); HLD(1 , -1 , 1); for(int i = 1; i <= n; i++) ans[i] = 1; for(int i = 1; i <= m; i++) { int u; cin >> u; update(edges[u].fi , edges[u].se , u); } while(q--){ int u; cin >> u; cout << ans[findAcs(u)] << '\n'; } } /** **/ signed main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); #define task "" if(fopen(task".inp","r")) { freopen(task".inp","r",stdin); freopen(task".out","w",stdout); } int tc = 1; // cin >> tc; while(tc--) solve(); // execute; }

Compilation message (stderr)

synchronization.cpp: In function 'int main()':
synchronization.cpp:223:15: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  223 |        freopen(task".inp","r",stdin);
      |        ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
synchronization.cpp:224:15: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  224 |        freopen(task".out","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...