比赛 期末考试1 评测结果 AAAAAAAAAA
题目名称 Output Only 最终得分 100
用户昵称 彭欣越 运行时间 3.759 s
代码语言 C++ 内存使用 35.89 MiB
提交时间 2026-02-08 11:36:01
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=200010;
int n,k,q,ans,t[N],c[N],s[N],f[N];
map<int,int>cnt[N];
vector<int>g[N];
void dfs(int u,int fa) {
    f[u]=fa;
    for (int v:g[u]) {
	    if (v!=fa) {
        	dfs(v,u);
        	cnt[u][t[v]]++;
    	}
    } 
}
int main () {
	freopen("tioj_outplay.in","r",stdin);
	freopen("tioj_outplay.out","w",stdout); 
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    cin >> n >> k >> q;
    for (int i=1;i<=n;i++) {
    	cin >> c[i];
    	t[i]=(k-c[i])%k;
	}
    for (int i=1;i<n;i++) {
    	int a,b;
    	cin >> a >> b;
    	g[a].push_back(b);
    	g[b].push_back(a);
	}
	dfs(1,0);
	for (int i=1;i<=n;i++) {
		if (i==1) ans+=(t[1]!=0);
		else ans+=(t[i]!=t[f[i]]);
	}
	//if (c[1]!=0) ans++;
	//cout << ans <<endl;
	for (int i=1;i<=q;i++) {
		int w,x,sum=0;
		cin >> w >> x;
		if (t[w]!=(k-x)%k) {
			if (w==1) {
				if (t[w]==0&&(k-x)%k!=0) ans++;
				else if (t[w]!=0&&(k-x)%k==0) ans--;
			}else{
				if (t[f[w]]==(k-x)%k&&t[f[w]]!=t[w]) ans--;
				else if (t[f[w]]!=(k-x)%k&&t[f[w]]==t[w]) ans++;
			}
			ans+=cnt[w][t[w]]-cnt[w][(k-x)%k];
			int a=t[w],b=(k-x)%k;
			t[w]=(k-x)%k;
			if (w!=1) {
                cnt[f[w]][a]--;
                if (cnt[f[w]][a]==0) cnt[f[w]].erase(a);
                cnt[f[w]][b]++;
            }
		}
		cout << ans <<endl;
	}
    return 0;
}