样例炸了求助

回复帖子

@liuyifan 2019-03-24 16:25 回复

样例输出6292.

#include<bits/stdc++.h>
#define reg register
#define ll long long
#define pi acos(-1)
using namespace std;
ll n,q,a1,a2,b1,b2,w,s[1000005],top,add[1000005],tag[1000005],mul[1000005],f[1000005],ch[1000005][2],v[1000005],sum[1000005],size[1000005];
char c;
inline void pushfan(reg ll x)
{
    swap(ch[x][0],ch[x][1]);
    tag[x]^=1;
}
inline void pushjia(reg ll x,reg ll d)
{
    sum[x]=(sum[x]+size[x]*d%51061)%51061;
    v[x]=(v[x]+d)%51061;
    add[x]=(add[x]+d)%51061;
}
inline void pushcheng(reg ll x,reg ll d)
{
    sum[x]=sum[x]*d%51061;
    v[x]=v[x]*d%51061;
    mul[x]=mul[x]*d%51061;
    add[x]=add[x]*d%51061;
}
inline void pushdown(reg ll x)
{
    if(mul[x]!=1)
    {
        pushcheng(ch[x][0],mul[x]);
        pushcheng(ch[x][1],mul[x]);
        mul[x]=1;
    }
    if(add[x])
    {
        pushjia(ch[x][0],add[x]);
        pushjia(ch[x][1],add[x]);
        add[x]=0;
    }
    if(tag[x])
    {
        if(ch[x][0])pushfan(ch[x][0]);
        if(ch[x][1])pushfan(ch[x][1]);
        tag[x]=0;
    }
}
inline void update(reg ll x)
{
    sum[x]=(sum[ch[x][0]]+sum[ch[x][1]]+v[x])%51061;
    size[x]=size[ch[x][0]]+size[ch[x][1]]+1;
}
inline bool isroot(reg ll x)
{
    return ch[f[x]][0]==x||ch[f[x]][1]==x;
}
inline ll get(reg ll x)
{
    return ch[f[x]][1]==x;
}
inline void rotate(reg ll x)
{
    reg ll fa=f[x],fafa=f[fa],k=get(x),u=ch[x][!k];
    if(isroot(fa))ch[fafa][get(fa)]=x;
    ch[x][!k]=fa;
    ch[fa][k]=u;
    if(u)f[u]=fa;
    f[fa]=x;
    f[x]=fafa;
    update(fa);
    update(x);
}
inline void splay(reg ll x)
{
    reg ll fa,fafa;
    top=0;
    s[++top]=fa=x;
    while(isroot(fa))s[++top]=fa=f[fa];
    while(top)pushdown(s[top--]);
    while(isroot(x))
    {
        fa=f[x];
        fafa=f[fa];
        if(isroot(fa))rotate((get(x)!=get(fa))?x:fa);
        rotate(x);
    }
    update(x);
}
inline void access(reg ll x)
{
    for(reg ll fa=0;x;x=f[fa=x])
    {
        splay(x);
        ch[x][1]=fa;
        update(x);
    }
}
inline void makeroot(reg ll x)
{
    access(x);
    splay(x);
    pushfan(x);
}
inline void split(reg ll x,reg ll y)
{
    makeroot(x);
    access(y);
    splay(y);
}
inline void link(reg ll x,reg ll y)
{
    makeroot(x);
    f[x]=y;
}
inline void cut(reg ll x,reg ll y)
{
    split(x,y);
    f[x]=ch[y][0]=0;
}

int main()
{
    scanf("%lld%lld",&n,&q);
    memset(size,1,sizeof size);
    memset(mul,1,sizeof mul);
    memset(v,1,sizeof v);
    for(reg ll i=1;i<=n-1;i++)
    {
        scanf("%lld%lld",&a1,&b1);
        link(a1,b1);
    }
    for(reg ll i=1;i<=q;i++)
    {
        cin>>c;
        if(c=='+')
        {
            scanf("%lld%lld%lld",&a1,&b1,&w);
            split(a1,b1);
            pushjia(b1,w);
        }
        if(c=='-')
        {
            scanf("%lld%lld%lld%lld",&a1,&b1,&a2,&b2);
            cut(a1,b1);
            link(a2,b2);
        }
        if(c=='*')
        {
            scanf("%lld%lld%lld",&a1,&b1,&w);
            split(a1,b1);
            pushcheng(b1,w);
        }
        if(c=='/')
        {
            scanf("%lld%lld",&a1,&b1);
            split(a1,b1);
            printf("%lld\n",sum[b1]);
        }
    }
    return 0;
}
@liuyifan 2019-03-24 16:53 回复 举报

好了找到第一个错误了 memset不能清1 但是还是WA 继续求改错

反馈
如果你认为某个帖子有问题,欢迎向洛谷反馈,以帮助更多的同学。



请具体说明理由,以增加反馈的可信度。