社区讨论

样例没过求调

P4074[WC2013] 糖果公园参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mhj1jqb6
此快照首次捕获于
2025/11/03 19:12
4 个月前
此快照最后确认于
2025/11/03 19:12
4 个月前
查看原帖
rt
CPP
#include<algorithm>
#include<iostream>
#include<vector>
#include<cmath>
#define int long long
using namespace std;
int f[200005] , g[200005] , dfn[200005] , deep[200005] , fa[200005][30] , idx , v[200005] , w[200005];
int ans[200005] , c , n , m , Q , len , block[200005] , cnt[200005] , num[200005] , a[200005] , lst[200005];
bool fl[200005];
vector<int> vec[200005];
struct query{
	int t , id , l , r;
	bool operator < (const query &b)const{
		return block[l] == block[b.l] ? r < b.r : block[l] < block[b.l];
	}
}q[200005];
struct ch{
	int x , y , t;
}change[200005];
int time1 , time2 , l , r , t = 1;
void dfs(int u , int F){
	fa[u][0] = F , deep[u] = deep[F] + 1;
	for(int i=1;i<31;i++)fa[u][i] = fa[fa[u][i-1]][i-1];
	dfn[f[u]=++idx] = u;
	for(int v:vec[u]){
		if(v==F)continue;
		dfs(v,u);
	}
	dfn[g[u]=++idx] = u;
}
int lca(int x , int y){
    if(deep[x]>deep[y])swap(x,y);
    int tmp = deep[y] - deep[x];
    for(int i=0;tmp;i++,tmp>>=1)if(tmp&1)y = fa[y][i];
    if(x==y)return x;
    for(int j=30;j>=0&&x!=y;j--){
        if(fa[x][j]!=fa[y][j])x = fa[x][j] , y = fa[y][j];
    }
    return fa[x][0];
}
void add(int x){
	if(fl[x])c -= v[cnt[x]] * w[a[cnt[x]]--];
	else c += v[cnt[x]] * w[++a[cnt[x]]];
	fl[x] ^= 1;
}
void modify(int x , int t){
	if(fl[x]){
		add(x) , cnt[x] = t , add(x);
	}else cnt[x] = t;
}
signed main(){
	cin >> n >> m >> Q;
	for(int i=1;i<=m;i++)cin >> v[i];
	for(int i=1;i<=n;i++)cin >> w[i];
	for(int i=1;i<n;i++){
		int u , v;cin >> u >> v;
		vec[u].push_back(v) , vec[v].push_back(u);
	}
	for(int i=1;i<=n;i++)cin >> cnt[i] , lst[i] = cnt[i];
	dfs(1,0);
	len = pow(idx,2.0/3);
	for(int i=1;i<=idx;i++)block[i] = (i - 1) / len + 1;
	for(int i=1;i<=Q;i++){
		int op , x , y;cin >> op >> x >> y;
		if(op==0)change[++time2] = {x,lst[x],y} , lst[x] = y;
		else{
			if(f[x]>f[y])swap(x,y);
			q[++time1] = {time2,time1,lca(x,y)==x?f[x]:g[x],f[y]};
		}
	}
	sort(q+1,q+time1+1);
	for(int i=1;i<=time1;i++){
		while(t<=q[i].t)modify(change[t].x,change[t].t) , t++;
		while(t>q[i].t)modify(change[t].x,change[t].y) , t--;
		while(l<q[i].l)add(dfn[l++]);
		while(l>q[i].l)add(dfn[--l]);
		while(r<q[i].r)add(dfn[++r]);
		while(r>q[i].r)add(dfn[r--]);
		int x = dfn[l] , y = dfn[r] , L = lca(x,y);
		if(x!=L&&y!=L)add(L) , ans[q[i].id] = c , add(L);
		else ans[q[i].id] = c;
	}
	for(int i=1;i<=time1;i++)cout << ans[i] << "\n";
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...