Submission #1159949

#TimeUsernameProblemLanguageResultExecution timeMemory
1159949son2008Synchronization (JOI13_synchronization)C++20
100 / 100
194 ms30020 KiB
#include<bits/stdc++.h> using namespace std; #define task "task" #define ii pair<int,int> #define fi first #define se second //#define int long long #define ll long long #define ld double #define mp make_pair #define lg2 30 #define iii pair<ll,ii> #define iiii pair<ii,ii> #define base 29 #define eps 1e-8 int dx[]= {0LL,0LL,1,-1,1,1,-1,-1}; int dy[]= {1,-1,0LL,0LL,1,-1,1,-1}; const int maxn=2e5+5,maxm=1e4+5,maxq=1e5+5; const int mod=1e9+7; int n,m,q; ii b[maxn]; int tin[maxn],tout[maxn],timer; int h[maxn],P[maxn][lg2+1]; bool check[maxn]; int thua[maxn],ans[maxn]; vector<int>a[maxn]; struct FEN { int n; vector<int>bit; FEN(){}; FEN(int _n):bit(n+1,0),n(_n+1) { }; int get(int r) { int ret = 0; for (; r >= 0; r = (r & (r + 1)) - 1) ret += bit[r]; return ret; } int get(int l, int r) { return get(r) - get(l - 1); } void update(int idx, int delta) { for (; idx < n; idx = idx | (idx + 1)) bit[idx] += delta; } void updateRange(int l,int r,int val) { update(l,val); update(r+1,-val); } }bit; void dfs(int u,int cha) { ans[u]=1; tin[u]=++timer; for(int v:a[u]) { if(v==cha)continue; h[v]=h[u]+1; P[v][0]=u; dfs(v,u); } tout[u]=timer; } void build_lca(){ for(int j=1;j<=lg2;j++){ for(int i=1;i<=n;i++) P[i][j]=P[P[i][j-1]][j-1]; } } int up(int u) { for(int i=lg2;i>=0;i--) { if(P[u][i]&&bit.get(tin[u])-bit.get(tin[P[u][i]])==(1<<i)){ u=P[u][i]; } } return u; } void init() { cin>>n>>m>>q; bit=FEN(n); for(int i=1;i<n;i++) { int u,v; cin>>u>>v; a[u].push_back(v); a[v].push_back(u); b[i]={u,v}; } } void process() { dfs(1,-1); build_lca(); while(m--) { int id;cin>>id; int u=b[id].fi,v=b[id].se; if(h[u]>h[v])swap(u,v); if(!check[id]) { ans[up(u)]+=ans[v]-thua[id]; bit.updateRange(tin[v],tout[v],1); } else { ans[v]=thua[id]=ans[up(u)]; bit.updateRange(tin[v],tout[v],-1); } check[id]^=1; } while(q--) { int x; cin>>x; cout<<ans[up(x)]<<'\n'; } } signed main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); if(fopen(task".inp","r")) { freopen(task".inp","r",stdin); freopen(task".out","w",stdout); } int t=1; // cin>>t; while(t--) { init(); process(); } cerr <<endl<< "TIME : " << clock() * 0.001 << "s" << endl ; }

Compilation message (stderr)

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