社区讨论
样例没过求调
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 条回复,欢迎继续交流。
正在加载回复...