Submission #1271327

#TimeUsernameProblemLanguageResultExecution timeMemory
1271327trandangquangSynchronization (JOI13_synchronization)C++20
100 / 100
79 ms18248 KiB
#include <bits/stdc++.h> using namespace std; #define foru(i,a,b) for(int i=(a); i<=(b); ++i) #define ford(i,a,b) for(int i=(a); i>=(b); --i) #define rep(i,a) for(int i=0; i<(a); ++i) #define bit(s,i) (((s)>>(i))&1) #define all(a) (a).begin(),(a).end() #define sz(a) (int)(a).size() #define ii pair<int,int> #define fi first #define se second #define eb emplace_back #define pb push_back #define ll long long #define __builtin_popcount(a) __builtin_popcountll(a) template <class X, class Y> bool maxi(X &x, Y y){return x<y?x=y,true:false;} template <class X, class Y> bool mini(X &x, Y y){return x>y?x=y,true:false;} const int N=1e5+5; int n,m,q; vector<int> adj[N]; ii edge[N]; int sz[N],h[N],par[N]; void pre(int u, int p=-1){ sz[u]=1; for(int v:adj[u]) if(v!=p){ h[v]=h[u]+1; par[v]=u; pre(v,u); sz[u]+=sz[v]; } } int idCh[N],head[N],curCh; int tin[N],lst[N],tim; void hld(int u, int p=-1){ if(!head[curCh]){ head[curCh]=u; } idCh[u]=curCh; tin[u]=++tim; lst[u]=tim; int bigCh=-1; for(int v:adj[u]) if(v!=p){ if(bigCh==-1 || sz[bigCh]<sz[v]) bigCh=v; } if(bigCh!=-1) hld(bigCh,u); for(int v:adj[u]) if(v!=p && v!=bigCh){ ++curCh; hld(v,u); } } int fw[N]; void upd(int id, int val){ for(; id<=n; id+=id&-id) fw[id]+=val; } void updR(int l, int r, int val){ upd(l,val); upd(r+1,-val); } int get(int id){ int res=0; for(; id>0; id-=id&-id) res+=fw[id]; return res; } /// phan chia ra hld -> de lay root hon int cont[N],pass[N]; bool state[N],jump[N]; int getRoot(int u){ while(true){ if(jump[u]) u=par[u]; else{ int v=get(tin[u]); if(u==v) break; u=v; } } return u; } void connect(int u, int v){ int rt=getRoot(u); cont[rt]=cont[rt]+cont[v]-pass[v]; if(idCh[u]!=idCh[v]) jump[v]=1; else{ rt=get(tin[u]); updR(tin[v],lst[v],rt-v); lst[rt]=lst[v]; } } void disconnect(int u, int v){ int rt=getRoot(u); pass[v]=cont[v]=cont[rt]; if(idCh[u]!=idCh[v]) jump[v]=0; else{ rt=get(tin[u]); updR(tin[v],lst[rt],v-rt); lst[v]=lst[rt]; lst[rt]=tin[u]; } } void solve(){ cin>>n>>m>>q; foru(i,1,n-1){ int u,v;cin>>u>>v; edge[i]={u,v}; adj[u].eb(v);adj[v].eb(u); } pre(1); hld(1); foru(i,1,n-1){ if(tin[edge[i].fi]>tin[edge[i].se]) swap(edge[i].fi, edge[i].se); } foru(i,1,n) cont[i]=1; foru(i,1,n) updR(tin[i],tin[i],i); foru(_,1,m){ int d; cin>>d; int u=edge[d].fi, v=edge[d].se; if(!state[d]){ connect(u,v); } else{ disconnect(u,v); } state[d]^=1; } foru(_,1,q){ int c; cin>>c; cout<<cont[getRoot(c)]<<'\n'; } } int32_t main(){ #define task "test" if(fopen(task".inp","r")){ freopen(task".inp","r",stdin); freopen(task".out","w",stdout); } cin.tie(0)->sync_with_stdio(0); solve(); }

Compilation message (stderr)

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