# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1107563 | PieArmy | Synchronization (JOI13_synchronization) | C++17 | 137 ms | 19448 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
typedef long long ll;
ll pie(ll army){return (1ll<<army);}
#include <bits/stdc++.h>
#define fr first
#define sc second
#define pb push_back
#define endl '\n'
#define mid ((left+right)>>1)
const ll inf=2000000000000000005;
const int sonsuz=2000000005;
using namespace std;
ll fpow(ll x,ll y,ll m=0){if(y<0){cout<<"powError";return -1;}if(m)x%=m;ll res=1;while(y>0){if(y&1)res*=x;x*=x;if(m){x%=m;res%=m;}y>>=1;}return res;}
struct Fen{
int n;
vector<int>tree,arr;
void init(int N){
n=N;
tree.resize(n+1,0);
arr.resize(n+1,0);
}
void update(int tar){
int x=((arr[tar]^1)-arr[tar]);
arr[tar]^=1;
while(tar<=n){
tree[tar]+=x;
tar+=(tar&-tar);
}
}
int qu(int tar){
int res=0;
while(tar){
res+=tree[tar];
tar-=(tar&-tar);
}
return res;
}
int query(int l,int r){
return qu(r)-qu(l-1);
}
};
int n,m,q;
Fen fen;
int tim=1;
int par[100001],ord[100001],nodes[100001],state[100001],sub[100001],lower[100001],pre[100001];
int ans[100001],old[100001];
vector<pair<int,int>>komsu[100001];
int find_par(int pos){
while(true){
if(state[pos]==0){
return pos;
}
if(fen.query(ord[par[pos]],ord[pos])!=ord[pos]-ord[par[pos]]+1){
int l=ord[par[pos]]+1,r=ord[pos];
while(l<r){
int mi=(l+r)/2;
if(fen.query(mi,ord[pos])==ord[pos]-mi+1){
r=mi;
}
else l=mi+1;
}
return pre[nodes[l]];
}
pos=pre[par[pos]];
}
}
void dfs1(int pos){
sub[pos]=1;
for(auto x:komsu[pos]){
if(sub[x.fr])continue;
lower[x.sc]=x.fr;
dfs1(x.fr);
sub[pos]+=sub[x.fr];
}
}
void dfs2(int pos){
int mx=-1;
for(auto x:komsu[pos]){
if(ord[x.fr])continue;
if(mx==-1||sub[x.fr]>sub[mx])mx=x.fr;
}
if(mx==-1)return;
ord[mx]=tim++;
nodes[ord[mx]]=mx;
pre[mx]=pos;
par[mx]=par[pos];
dfs2(mx);
for(auto x:komsu[pos]){
if(ord[x.fr])continue;
ord[x.fr]=tim++;
pre[x.fr]=pos;
par[x.fr]=x.fr;
nodes[ord[x.fr]]=x.fr;
dfs2(x.fr);
}
}
void code(){
cin>>n>>m>>q;
for(int i=1;i<n;i++){
int x,y;cin>>x>>y;
komsu[x].pb({y,i});
komsu[y].pb({x,i});
}
fen.init(n);
ord[1]=tim++;
par[1]=1;
nodes[ord[1]]=1;
dfs1(1);
dfs2(1);
for(int i=1;i<=n;i++){
ans[i]=1;
}
for(int i=1;i<=m;i++){
int x;cin>>x;
x=lower[x];
if(state[x]==0){
fen.update(ord[x]);
state[x]^=1;
int u=find_par(x);
ans[u]+=ans[x]-old[x];
old[x]=ans[x];
}
else{
int u=find_par(x);
ans[x]=old[x]=ans[u];
fen.update(ord[x]);
state[x]^=1;
}
}
for(int i=1;i<=n;i++){
if(state[i]){
int u=find_par(i);
ans[i]=old[i]=ans[u];
fen.update(ord[i]);
state[i]^=1;
}
}
while(q--){
int x;cin>>x;
cout<<ans[x]<<endl;
}
}
int main(){
ios_base::sync_with_stdio(false);cin.tie(NULL);
bool usaco=0;if(usaco){freopen(".in","r",stdin);freopen(".out","w",stdout);}
int t=1;
if(!t)cin>>t;
while(t--){code();cout<<endl;}
return 0;
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |