QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#419950#8716. 树yangyuchen17WA 1ms7736kbC++142.4kb2024-05-24 13:00:262024-05-24 13:00:26

Judging History

你现在查看的是最新测评结果

  • [2024-05-24 13:00:26]
  • 评测
  • 测评结果:WA
  • 用时:1ms
  • 内存:7736kb
  • [2024-05-24 13:00:26]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=2e5+5,M=2*N;

int n,m,q,b[N],deep[N],f[N][20];
int a[N],c[N];
int h[N],e[N],ne[N],idx;

void add(int u,int v){
    e[idx]=v,ne[idx]=h[u],h[u]=idx++;
}

bool vis[N];
void dfs1(int u){
    vis[u]=true;
    for(int i=h[u];~i;i=ne[i]){
        int v=e[i];
        if(vis[v]) continue;
        deep[v]=deep[u]+1;
        f[v][0]=u;
        for(int j=1;j<=20;j++) f[v][j]=f[f[v][j-1]][j-1];
        dfs1(v);
    }
}

int main(){
    cin>>n>>m>>q;
    memset(h,-1,sizeof h);
    a[1]=c[n]=-1;
    int u,v,ans=2;
    for(int i=1;i<n;i++){
        cin>>u>>v;
        add(u,v),add(v,u);
    }
    dfs1(1);
    cin>>b[1];
    for(int i=2;i<=m;i++){
        cin>>b[i];
        int x=b[i],y=b[i-1],d=deep[b[i]]-deep[b[i-1]],cnt=0;
        if(d<0) d=-d,swap(x,y);
        if(d) d--;
        else continue;
        while(d){
        	if(d&1) x=f[x][cnt];
        	d>>=1,cnt++;
		}
		if(f[x][0]==y){
			if(deep[b[i]]>deep[b[i-1]]) c[i-1]=x;
			else a[i]=x;
		}
    }

    for(int i=2;i<=m;i++){
        if(a[i]==c[i]){
            ans++;
            //cout<<b[i]<<":"<<a[i]<<" "<<c[i]<<endl;
        }
    }
    //cout<<ans<<endl;
    int i;
    while(q--){
        cin>>i>>u;
        b[i]=u;
        if(a[i]==c[i]) ans--;
        if(i!=n){
        	if(a[i+1]==c[i+1]) ans--;
        	int x=b[i+1],y=b[i],d=deep[b[i+1]]-deep[b[i]],cnt=0;
    	    if(d<0) d=-d,swap(x,y);
    	    if(d) d--;
    	    else continue;
    	    while(d){
    	    	if(d&1) x=f[x][cnt];
    	    	d>>=1,cnt++;
			}
			if(f[x][0]==y){
				if(deep[b[i+1]]>deep[b[i]]) c[i]=x,a[i+1]=0;
				else a[i+1]=x,c[i]=0;
			}else a[i+1]=c[i]=0;
			if(a[i+1]==c[i+1]) ans++;
		}
		if(i!=1){
			if(a[i-1]==c[i-1]) ans--;
			int x=b[i],y=b[i-1],d=deep[b[i]]-deep[b[i-1]],cnt=0;
    	    if(d<0) d=-d,swap(x,y);
    	    if(d) d--;
    	    else continue;
    	    while(d){
    	    	if(d&1) x=f[x][cnt];
    	    	d>>=1,cnt++;
			}
			if(f[x][0]==y){
				if(deep[b[i]]>deep[b[i-1]]) c[i-1]=x,a[i]=0;
				else a[i]=x,c[i-1]=0;
			}else a[i]=c[i-1]=0;
			if(a[i-1]==c[i-1]) ans++;
		}
		if(a[i]==c[i]) ans++;
        cout<<ans<<endl;
        /*
        for(int i=1;i<=m;i++){
            cout<<b[i]<<":"<<a[i]<<" "<<c[i]<<endl;
        }
        */
    }
    return 0;
}
/*
5 5 3
2 1
3 2
1 4
5 1
1 5 4 2 3
1 3
5 3
3 3
*/

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 1ms
memory: 7656kb

input:

5 5 3
2 1
3 2
1 4
5 1
1 5 4 2 3
1 3
5 3
3 3

output:

4
4
5

result:

ok 3 number(s): "4 4 5"

Test #2:

score: -100
Wrong Answer
time: 1ms
memory: 7736kb

input:

30 200 200
10 24
10 13
10 26
13 29
27 26
17 24
27 21
17 15
13 5
13 30
27 3
18 21
9 21
2 24
10 4
11 5
2 8
10 23
1 18
21 25
4 20
12 23
22 27
28 27
18 7
13 6
14 30
10 19
16 21
14 29 25 30 1 17 22 21 11 19 21 30 13 1 22 10 14 7 29 7 15 21 25 29 25 7 29 7 1 23 3 17 2 7 4 27 18 26 3 6 5 3 16 26 20 19 16 2...

output:

180
180
180
180
180
179
177
177
177
178
176
176
176
176
174
173
173
172
172
170
170
169
168
166
166
165
165
166
162
161
161
161
159
159
160
161
160
160
157
154
154
155
155
155
152
152
151
151
151
151
151
152
152
153
153
153
153
153
153
153
153
153
153
151
151
151
151
151
151
151
151
151
151
151
148
...

result:

wrong answer 1st numbers differ - expected: '174', found: '180'