求调
查看原帖
求调
1602807
jokersen楼主2025/7/30 21:56

样例没过,应该是修改操作的问题。

代码:

#include<bits/stdc++.h>
#ifdef WIN32
#define getc() getchar()
#else
#define getc() getchar_unlocked()
#endif
#define N 100005
using namespace std;
using lli=long long int;
struct query{
    int l,r,t,id;
}q1[N];
struct update{
    int p,c;
}q2[N];
int n,m,q,B,len,qcnt,rcnt;
int v[N],w[N],c[N],a[N<<1],f[N],g[N],fa[N][25],dep[N],cnt[N];
lli sum,ans[N];
vector<int>s[N];
bitset<N<<1>vis;
void read(int &n){
    n=0;bool neg=false;
    char c=getc();
    while(c<'0'||c>'9') neg^=c=='-',c=getc();
    while(c>='0'&&c<='9') n=(n<<1)+(n<<3)+(c^48),c=getc();
    n=neg?-n:n;
}
void print(lli x){
    if(!x) return putchar('0'),void();
    if(x<0) putchar('-'),x=-x;
    int top=0,a[20];
    while(x) a[top++]=x%10,x/=10;
    while(top) putchar(a[--top]+'0');
}
void dfs(int x,int fafa){
    a[f[x]=++len]=x,dep[x]=dep[fafa]+1;
    for(auto p:s[x]){
        if(p==fafa) continue;
        fa[p][0]=x,dfs(p,x);
    }
    a[g[x]=++len]=x;
}
int LCA(int x,int y){
    if(dep[x]<dep[y]) swap(x,y);
    if(dep[x]!=dep[y])
        for(int i=20;i>=0;i--){
            int v=fa[x][i];
            if(dep[v]>=dep[y]) x=v;
        }
    if(x==y) return x;
    for(int i=20;i>=0;i--){
        int vx=fa[x][i],vy=fa[y][i];
        if(vx!=vy) x=vx,y=vy;
    }
    return fa[x][0];
}
void sol(int x){
    if(vis[x]) sum-=1ll*v[c[x]]*w[cnt[c[x]]--];
    else sum+=1ll*v[c[x]]*w[++cnt[c[x]]];
    vis[x]=!vis[x];
}
bool cmp(query x,query y){
    if(x.l/B^y.l/B) return x.l<y.l;
    if(x.r/B^y.r/B) return (x.l/B&1)?x.r<y.r:x.r>y.r;
    return x.t<y.t;
}
int main(){
    read(n),read(m),read(q),B=ceil(pow(n<<1,2.0/3));
    for(int i=1;i<=m;i++) read(v[i]);
    for(int i=1;i<=n;i++) read(w[i]);
    for(int i=1,a,b;i<n;i++){
        read(a),read(b);
        s[a].push_back(b);
        s[b].push_back(a);
    }
    for(int i=1;i<=n;i++) read(c[i]);
    dfs(1,0);
    for(int j=1;j<=20;j++)
        for(int i=1;i<=n;i++)
            fa[i][j]=fa[fa[i][j-1]][j-1];
    for(int i=1,Type,x,y;i<=q;i++){
        read(Type),read(x),read(y);
        if(!Type) q2[++rcnt]={x,y};
        else{
            if(f[x]>f[y]) swap(x,y);
            q1[++qcnt]={LCA(x,y)==x?f[x]:g[x],f[y],rcnt,qcnt};
        }
    }
    sort(q1+1,q1+qcnt+1,cmp);
    for(int i=1,l=1,r=0,t=0;i<=qcnt;i++){
        auto p=q1[i];
        while(t<p.t){
            t++;
            int u=q2[t].p;
            if(vis[u]) sol(u);
            swap(c[u],q2[t].c);
            if(vis[u]) sol(u);
        }
        while(t>p.t){
            int u=q2[t].p;
            if(vis[u]) sol(u);
            swap(c[u],q2[t].c);
            if(vis[u]) sol(u);
            t--;
        }
        while(l>p.l) sol(a[--l]);
        while(r<p.r) sol(a[++r]);
        while(l<p.l) sol(a[l++]);
        while(r>p.r) sol(a[r--]);
        int u=a[l],v=a[r],lca=LCA(u,v);
        if(u!=lca&&v!=lca) sol(lca);
        ans[p.id]=sum;
        if(u!=lca&&v!=lca) sol(lca);
    }
    for(int i=1;i<=qcnt;i++) print(ans[i]),puts("");
    return 0;
}
2025/7/30 21:56
加载中...