极其离谱的问题(
查看原帖
极其离谱的问题(
469470
EurekaStriker楼主2023/6/13 16:18

我的代码在luogu上过了,但是在老师的oj上完全一样的题一直显示segmentation fault,我真的麻了,后来我把所有东西都暴力开longlong后竟然显示bus error??

广大的谷友们求求了帮我看一眼我的代码有没有什么小漏洞吧,疯了

#include<bits/stdc++.h>
#define lson pos<<1
#define rson pos<<1|1
using namespace std;
const int N=1e5+10;
long long n,tot,cnt,q;
long long head[N],nxt[N*2],to[N*2];
long long fa[N],deep[N],sz[N],son[N];
long long id[N],top[N];
long long tree[N*4],lazy[N*4];
void add(int x,int y)
{
    to[++tot]=y;
    nxt[tot]=head[x];
    head[x]=tot;
}
void dfs1(int x,int f)
{
    deep[x]=deep[f]+1;
    fa[x]=f;
    sz[x]=1;
    for(int i=head[x];i;i=nxt[i])
    {
        int y=to[i];
        if(y==f)
            continue;
        dfs1(y,x);
        sz[x]+=sz[y];
        if(!son[x]||sz[son[x]]<sz[y])
            son[x]=y;
    }
}
void dfs2(int x,int t)
{
    id[x]=++cnt;
    top[x]=t;
    if(!son[x])
        return;
    dfs2(son[x],t);
    for(int i=head[x];i;i=nxt[i])
    {
        int y=to[i];
        if(y==fa[x]||y==son[x])
            continue;
        dfs2(y,y);
    }
}
void pushdown(int pos,int l,int r)
{
    int mid=(l+r)>>1;
    tree[lson]+=(mid-l+1)*lazy[pos];
    lazy[lson]+=lazy[pos];
    tree[rson]+=(r-mid)*lazy[pos];
    lazy[rson]+=lazy[pos];
    lazy[pos]=0;
}
void update(int pos,int l,int r,int x,int y,int k)
{
    int mid=(l+r)>>1;
    if(x<=l&&r<=y)
    {
        tree[pos]+=(r-l+1)*k;
    	lazy[pos]+=k;
        return;
    }
    pushdown(pos,l,r);
    if(x<=mid)
        update(lson,l,mid,x,y,k);
    if(y>mid)
        update(rson,mid+1,r,x,y,k);
    tree[pos]=tree[lson]+tree[rson];
}
void upd_chain(int x,int y,int k)
{
    while(top[x]!=top[y])
    {
        if(deep[top[x]]<deep[top[y]])
            swap(x,y);
        update(1,1,n,id[top[x]],id[x],k);
        x=fa[top[x]];
    }
    if(deep[x]<deep[y])
        swap(x,y);
    update(1,1,n,id[y],id[x],k);
}
long long query(int pos,int l,int r,int x,int y)
{
    long long ret=0;
    int mid=(l+r)>>1;
    if(x<=l && r<=y)
        return tree[pos];
    pushdown(pos,l,r);
    if(x<=mid)
        ret+=query(lson,l,mid,x,y);
    if(y>mid)
        ret+=query(rson,mid+1,r,x,y);
    return ret;
}
int main()
{
    scanf("%lld",&n);
    for(int i=1;i<n;i++)
    {
        long long x,y;
        scanf("%lld%lld",&x,&y);
        x++,y++;
        add(x,y);
        add(y,x);
    }
    dfs1(1,0);
    dfs2(1,1);
    scanf("%lld",&q);
    while(q--)
    {
        char c;
        cin>>c;
        if(c=='A')
        {
            long long x,y,d;
            scanf("%lld%lld%lld",&x,&y,&d);
            x++,y++;
            upd_chain(x,y,d);
        }
        else
        {
            long long x;
            scanf("%lld",&x);
            printf("%lld\n",query(1,1,n,id[x+1],id[x+1]+sz[x+1]-1));
        }
    }
    return 0;
}
2023/6/13 16:18
加载中...