为什么T了6个点求助!!!

P4074 [WC2013] 糖果公园

笙瑟 @ 2019-03-05 20:10:16

#include<bits/stdc++.h>
using namespace std;
int n,m,q,cnt,s,x,y,z,t1,t2,top,tot,l,r,now,t;
long long ans,anss[100005];
int a[100005],b[100005],v[100005],w[100005],fir[200005],nex[200005],to[200005];
int f[100005][30],depth[100005],sta[100005],xx[100005],yy[100005],num[100005];
bool vis[100005];
struct query
{
    int l,r,note,xg;
    bool operator<(query&x)
    {
        return b[l]==b[x.l] ? (b[r]==b[x.r] ? xg<x.xg :b[r]<b[x.r]):b[l]<b[x.l];
    }
}c[100005];
inline void in(int &x)
{
    int f=1;x=0;char s=getchar();
    while(s>'9' or s<'0'){if(s=='-')f=-1;s=getchar();}
    while(s>='0' and s<='9'){x=x*10+s-'0';s=getchar();}
    x*=f;
}
void add(int x,int y)
{
    to[++cnt]=y;
    nex[cnt]=fir[x];
    fir[x]=cnt;
}
void dfs(int now,int father)
{
    t=top;
    f[now][0]=father;
    depth[now]=depth[father]+1;
    for(int i=1;(1<<i)<=depth[now];i++)
        f[now][i]=f[f[now][i-1]][i-1];
    for(int i=fir[now];i!=0;i=nex[i])
        if (to[i]!=father) 
        {
            dfs(to[i],now);
            if (top-t>=s)
            {
                ++tot;
                while (top>t) b[sta[top--]]=tot;
            }
        }
    sta[++top]=x;
}
int lca(int a,int b)
{
    if (depth[a]>depth[b]) swap(a,b);
    for(int i=16;i>=0;i--)
        if (depth[a]<=depth[b]-(1<<i))
            b=f[b][i];
    if (a==b) return(a);
    for(int i=16;i>=0;i--)
        if (f[a][i]!=f[b][i])
        {
            a=f[a][i];b=f[b][i];
        }
    return(f[a][0]);
}
inline void opp(int x)
{
    if (vis[x]) ans-=1ll*v[a[x]]*w[num[a[x]]--];
    else ans+=1ll*v[a[x]]*w[++num[a[x]]];
    vis[x]^=1;
}
inline void dmodify(int u,int v)
{
    if (depth[u]<depth[v]) swap(u,v);
    while (depth[u]>depth[v])
    {
        opp(u);
        u=f[u][0];
    }
    while (u!=v)
    {
        opp(u);
        opp(v);
        u=f[u][0];
        v=f[v][0];
    }
}
inline void modify(int now)
{
    if (vis[xx[now]])
    {
        opp(xx[now]);
        swap(a[xx[now]],yy[now]);
        opp(xx[now]);
    }
    else swap(a[xx[now]],yy[now]);
}
int main()
{
    in(n);in(m);in(q);
    s=pow(n,0.6666);
    for(int i=1;i<=m;i++) in(v[i]);
    for(int i=1;i<=n;i++) in(w[i]);
    for(int i=1;i<=n-1;i++) in(x),in(y),add(x,y),add(y,x);
    for(int i=1;i<=n;i++) in(a[i]);
    dfs(1,0);
    tot++;
    while (top)
    {
        b[sta[top--]]=tot;
    }
    for(int i=1;i<=q;i++)
    {
        in(z);
        if (z==0)
        {
            ++t2;
            in(xx[t2]),in(yy[t2]);
        }
        else
        {
            ++t1;
            in(c[t1].l);in(c[t1].r);
            c[t1].note=t1;
            c[t1].xg=t2;
        }
    }
    sort(c+1,c+t1+1);
    l=1;r=1;now=0;
    int llca;
    for(int i=1;i<=t1;i++)
    {
        dmodify(l,c[i].l);
        dmodify(r,c[i].r);
        l=c[i].l;r=c[i].r;
        while (now<c[i].xg) modify(++now);
        while (now>c[i].xg) modify(now--);
        llca=lca(l,r);
        opp(llca);
        anss[c[i].note]=ans;
        opp(llca);
    } 
    for(int i=1;i<=t1;i++)
        printf("%lld\n",anss[i]);
}

by aminoas @ 2019-03-05 20:13:50

你的时间复杂度太高了


by 笙瑟 @ 2019-03-05 20:37:45

@2018J1605 那怎么改进呢?


by aminoas @ 2019-03-05 20:39:17

wobuhui


|