悬赏2关注 HDU7144 求调 RE (爆栈)
  • 板块学术版
  • 楼主Zi_Gao
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/7/28 14:53
  • 上次更新2023/11/3 07:13:54
查看原帖
悬赏2关注 HDU7144 求调 RE (爆栈)
554698
Zi_Gao楼主2023/7/28 14:53

Runtime Error (STACK_OVERFLOW) 已经查出问题了是哪个地方了

本地测试样例没问题,HDU数据会RE。

具体在:在第231行的dfs(代码中注释的地方)进行修改操作会RE。但是奇怪的是我在初始化也用的这个函数不会RE,在后面调用就会RE。而且测试过我初始化完成之后重新跑一侧DFS也会RE。

#pragma comment(linker, "/STACK:202400000,202400000")
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#define int long long
// #define ONLINE_JUDGE
#define INPUT_DATA_TYPE int
#define OUTPUT_DATA_TYPE long long
INPUT_DATA_TYPE read(){register INPUT_DATA_TYPE x=0;register char f=0,c=getchar();while(c<'0'||'9'<c)f=(c=='-'),c=getchar();while('0'<=c&&c<='9')x=(x<<3)+(x<<1)+(c&15),c=getchar();return f?-x:x;}void print(OUTPUT_DATA_TYPE x){register char s[20];register int i=0;if(x<0){x=-x;putchar('-');}if(x==0){putchar('0');return;}while(x){s[i++]=x%10;x/=10;}while(i){putchar(s[--i]+'0');}return;}

struct UF{
    int parents[400010];
    void build(int n){
        register int i;
        for(i=0;i<=n;++i) parents[i]=i;
        return;
    }
    int find(int x){return (x==parents[x])?(x):(parents[x]=find(parents[x]));}
    void merge(int u,int v,int root){parents[find(u)]=root,parents[find(v)]=root;}
}U;

struct EDGE{
    int u,v,w;
    bool operator < (const EDGE another) const{
        return w<another.w;
    }
}edges[400010];

struct kNODE{
    int lChild,rChild,val,lit,id,cnttree,par,linktop,dep,color,imgId;
}tree[400010];

struct iNODE{
    int lChild,rChild,par,kid;
    long long max,val;
}imgTree[100010][15];

const int ZSEG_SIZE=400010;

struct ZSEG_TREE{
    long long tree[ZSEG_SIZE<<2];
    int size;

    void clear(){
        memset(tree,0,sizeof(long long)*(size+10)*2);
        size=0;
        return;
    }

    void build(int n){
        register int i;
        int logn=std::__lg(n+2)+1;
        size=1<<logn;
        for(i=1;i<=n;++i) tree[size+i]=0;
        for(i=size;i;--i) tree[i]=tree[i<<1]+tree[i<<1|1];
        return;
    }

    void update(int pos,long long val){
        for(pos+=size;pos;pos>>=1) tree[pos]+=val;
    }

    long long query(int l,int r){
        long long res=0;
        for(l+=size-1,r+=size+1;l^r^1;l>>=1,r>>=1){
            if(~l&1) res+=tree[l^1];
            if(r&1) res+=tree[r^1];
        }
        return res;
    }
}seg;

int cntid,sid[400010];

std::vector<int> imgcur[400010],cur;

void dfsinit(int u,int p){
    if(!u) return;
    tree[u].cnttree=1;
    tree[u].par=p;
    tree[u].dep=tree[p].dep+1;
    dfsinit(tree[u].lChild,u);
    dfsinit(tree[u].rChild,u);
    tree[u].cnttree+=tree[tree[u].lChild].cnttree+tree[tree[u].rChild].cnttree;
    if(tree[tree[u].lChild].cnttree<tree[tree[u].rChild].cnttree) tree[u].rChild^=tree[u].lChild^=tree[u].rChild^=tree[u].lChild;
    return;
}

void dfslink(int u,int top){
    if(!u) return;
    tree[u].linktop=top;
    tree[u].id=++cntid;
    sid[tree[u].id]=u;
    dfslink(tree[u].lChild,top);
    dfslink(tree[u].rChild,tree[u].rChild);
    return;
}

int getLca(register int u,register int v){
    while(tree[u].linktop!=tree[v].linktop){
        if(tree[tree[u].linktop].dep<tree[tree[v].linktop].dep) u^=v^=u^=v;
        u=tree[tree[u].linktop].par;
    }
    if(tree[u].dep<tree[v].dep) u^=v^=u^=v;
    return v;
}

void dfsImg(int col,int u){
    if(!u) return;
    dfsImg(col,imgTree[col][u].lChild);
    dfsImg(col,imgTree[col][u].rChild);
    int l=imgTree[col][imgTree[col][u].lChild].max;
    int r=imgTree[col][imgTree[col][u].rChild].max;
    imgTree[col][u].max=std::max(tree[imgTree[col][u].kid].val,std::max(l,r));
    long long cp=-imgTree[col][u].val;
    imgTree[col][u].val=imgTree[col][u].max-l-r;
    cp+=imgTree[col][u].val;
    seg.update(tree[imgTree[col][u].kid].id,cp);
    return;
}

int find(register int u,register int lit){
    while(lit>=tree[tree[tree[u].linktop].par].lit&&tree[tree[u].linktop].par) u=tree[tree[u].linktop].par;
    register int l=tree[tree[u].linktop].id,r=tree[u].id+1,mid;
    while(l<r){
        mid=(l+r)>>1;
        if(tree[sid[mid]].lit>lit) l=mid+1;
        else r=mid;
    }
    // if(tree[sid[mid]].lit>lit) 
    return sid[l];
}

long long query(int u){
    return seg.query(tree[u].id,tree[u].id+tree[u].cnttree-1);
}

signed main(){
	#ifndef ONLINE_JUDGE
	freopen("name.in", "r", stdin);
	freopen("name.out", "w", stdout);
	#endif

    register int T=read(),n,m,i,q,u,v,w,tot,root,op;
    while(T--){
        n=read();m=read();q=read();
        for(i=1;i<=n;++i) tree[i].color=read(),imgcur[tree[i].color].push_back(i);
        for(i=1;i<=n;++i) tree[i].val=read();
        for(i=0;i<m;++i){
            edges[i].u=read();
            edges[i].v=read();
            edges[i].w=read();
        }
        std::sort(edges,edges+m);
        U.build((n<<1)+10);
        for(i=0,tot=n+1;i<m;++i){
            if(U.find(edges[i].u)!=U.find(edges[i].v)){
                tree[tot].lChild=U.find(edges[i].u);
                tree[tot].rChild=U.find(edges[i].v);
                U.merge(edges[i].u,edges[i].v,tot);
                tree[tot].lit=edges[i].w;
                ++tot;
            }
        }

        root=tot-1;

        dfsinit(root,0);
        dfslink(root,root);

        // for(i=1;i<tot;++i) printf("u%d par%d lc%d rc%d val%d dep%d hson%d top%d\n",i,tree[i].par,tree[i].lChild,tree[i].rChild,tree[i].val,tree[i].dep,tree[i].lChild,tree[i].linktop);

        seg.build(tot-1);

        // for(u=1;u<tot;++u)
        //     for(v=1;v<tot;++v) printf("u%d v%d lca%d\n",u,v,getLca(u,v));

        for(i=1;i<=n;++i){
            if(imgcur[i].empty()) continue;
            std::sort(imgcur[i].begin(),imgcur[i].end(),[](int a,int b){return tree[a].id<tree[b].id;});

            cur=imgcur[i];
            imgcur[i].clear();
            for(u=0;u+1<cur.size();++u){
                imgcur[i].push_back(cur[u]);
                imgcur[i].push_back(getLca(cur[u],cur[u+1]));
            }
            imgcur[i].push_back(cur.back());

            std::sort(imgcur[i].begin(),imgcur[i].end(),[](int a,int b){return tree[a].id<tree[b].id;});
            std::unique(imgcur[i].begin(),imgcur[i].end());

            // tree[imgcur[i][0]].imgId=1;
            // imgTree[i][1].kid=imgcur[i][0];

            for(u=0;u<imgcur[i].size();++u){
                tree[imgcur[i][u]].imgId=u+1;
                imgTree[i][u+1].kid=imgcur[i][u];
                // if(u+2>10||u+1<0) return -1;
            }

            for(u=0;u+1<imgcur[i].size();++u){
                imgTree[i][u+2].par=tree[getLca(imgcur[i][u],imgcur[i][u+1])].imgId;
                if(imgTree[i][imgTree[i][u+2].par].lChild) imgTree[i][imgTree[i][u+2].par].rChild=u+2;
                else imgTree[i][imgTree[i][u+2].par].lChild=u+2;
            }

            // for(u=1;u<=imgcur[i].size();++u) printf("id%d kid%d lc%d rc%d par%d\n",u,imgTree[i][u].kid,imgTree[i][u].lChild,imgTree[i][u].rChild,imgTree[i][u].par);

            // putchar('\n');

            dfsImg(i,1);
        }

        // for(i=1;i<=n;++i){
        //     if(imgcur[i].empty()) continue;
        //     dfsImg(i,1);
        // }

        // for(i=1;i<tot;++i) printf("u%d c%d id%d siz%d lit%d ival%d imgpar%d il%d ir%d\n",i,tree[i].color,tree[i].id,tree[i].cnttree,tree[i].lit,tree[i].imgVal,tree[i].imgpar,tree[i].imgLc,tree[i].imgRc);

        // printf("%d",find(1,4));

        for(i=0;i<q;++i){
            op=read();
            u=read();
            if(op==0){
                tree[u].val=tree[u].val+read();
                // if(imgcur[tree[u].color].empty()) return -1;
                dfsImg(tree[u].color,1);//*****这个地方
            }
            else{
                print(query(find(u,read())));putchar('\n');
            }
        }

        cntid=0;

        for(i=1;i<=n;++i) imgcur[i].clear();
        memset(imgTree,0,sizeof(imgTree));
        // memset(imgTree)
    }

	#ifndef ONLINE_JUDGE
	fclose(stdin);
	fclose(stdout);
	#endif
    return 0;
}
2023/7/28 14:53
加载中...