MnZn MLE+TLE求条
查看原帖
MnZn MLE+TLE求条
701254
Mu_leaf楼主2024/5/24 15:04

VScode 报错信息:

在初始化树剖的时候就已经炸了,救救孩子吧,调了好久了。

#include <bits/stdc++.h>
#define int long long
#define ls (son[x][0])
#define rs (son[x][1])
#define mid ((l+r)>>1)
using namespace std;
namespace IO
{
	char buff[1<<21],*p1=buff,*p2=buff;
	char getch(){return p1==p2&&(p2=((p1=buff)+fread(buff,1,1<<21,stdin)),p1==p2)?EOF:*p1++;}
	template<typename T>
	void read(T &x){char ch=getch();int fl=1;x=0;while(ch>'9'||ch<'0'){if(ch=='-')fl=-1;ch=getch();}while(ch<='9'&&ch>='0'){x=x*10+ch-48;ch=getch();}x*=fl;}
	template<typename T,typename ...Args>
	void read(T &x,Args& ...args){read(x);read(args...);}
	char obuf[1<<21],*p3=obuf;
	void putch(char ch) {if(p3-obuf<(1<<21))*p3++=ch;else fwrite(obuf,p3-obuf,1,stdout),p3=obuf,*p3++=ch;}
	char ch[100];
	template<typename T>
	void write(T x) {if(!x)return putch('0');if(x<0)putch('-'),x*=-1;int top=0;while(x)ch[++top]=x%10+48,x/=10;while(top)putch(ch[top]),top--;}
	template<typename T,typename ...Args>
	void write(T x,Args ...args) {write(x);write(args...);}
	void put(string s){for(int i=0;i<s.size();i++)putch(s[i]);}
	void flush(){fwrite(obuf,p3-obuf,1,stdout);}
	void End(){flush();exit(0);}
}
using namespace IO;
const int N=1e5+5,M=N*80;
int n,m,val[N];
vector<int> V[N];
struct Tree{
    //-------线段树
    int root[N],cnt=0;
    int tr[M],lazy[M],son[M][2];
    void pushup(int x){
        tr[x]=tr[ls]+tr[rs];
    }
    int change(int x,int l,int r,int k,int v){
        if(!x) x=++cnt;
        if(l==r){
            tr[x]+=v;
            return x;
        }
        if(k<=mid) son[x][0]=change(ls,l,mid,k,v);
        else son[x][1]=change(rs,mid+1,r,k,v);
        pushup(x);
        return x;
    }
    int query(int x,int l,int r,int lt,int rt){
        if(l>=lt && r<=rt)return tr[x];
        int ans=0;
        if(lt<=mid) ans+=query(ls,l,mid,lt,rt);
        if(rt >mid) ans+=query(rs,mid+1,r,lt,rt);
        return ans;
    }
    void add(int x,int d,int w){
        root[x] = change(root[x],0,n,d,w);
    }
    int Sum(int x,int s,int t){
        return query(root[x],0,n,s,t);
    }
}f1,f2;
namespace Lca{
    //---------树剖
    int fap[N],dep[N],son[N],siz[N],top[N];
    void dfs1(int x,int f,int de){
        fap[x]=f;
		siz[x]=1;
        // cout << de << "\n";
		dep[x]=dep[f]+1;
        int fat=-1;
        for(auto v:V[x]){
            // int v=V[x][i]; 
            if(v==f) continue;
            dfs1(v,x,de+1);
            siz[x]+=siz[v];
            if(siz[v]>fat) fat=siz[v],son[x]=v;
        }
    }
    void dfs2(int x,int tp){
        top[x]=tp;
        if(!son[x]) return;
        dfs2(son[x],tp);
        for(auto v:V[x]){
            if(v==fap[x] || v==son[x]) continue;
            dfs2(v,v);
        }
    }
    int lca(int x,int y){
        while(top[x]!=top[y]){
            if(dep[top[x]]<dep[top[y]]) swap(x,y);
            x=fap[top[x]];
        }
        return dep[x]<dep[y]?x:y;
    }
    int dis(int x,int y){return dep[x]+dep[y]-2*dep[lca(x,y)];}
	//--------点分树
    int rt,Mx[N],sizp[N];
    int vis[N],sum,fa[N];
    void get_rt(int x,int f){
        sizp[x]=1;
        for(int v:V[x]){
            if(vis[v] || v==f) continue;
            get_rt(v,x);
            sizp[x]+=sizp[v];
            Mx[x]=max(Mx[x],sizp[v]);            
        }
        Mx[x]=max(Mx[x],sum-sizp[x]);
        if(Mx[x]<Mx[rt]) rt=x;
    }
    void update(int x,int w){
        for(int i=x;i;i=fa[i]){
            f1.add(i,Lca::dis(x,i),w);
        }
        for(int i=x;fa[i];i=fa[i]){
            f2.add(i,Lca::dis(x,fa[i]),w);
        }
    }
    void get_tree(int x,int f,int dep){
        fa[x]=f;vis[x]=1;
        update(x,val[x]); 
        for(auto v:V[x]){
            if(vis[v]) continue;
            Mx[rt=0]=1e9;
            sum=siz[v];
            get_rt(v,x);
            get_tree(rt,x,dep+1);
        }
    }
	void init(){
        dfs1(1,0,1);dfs2(1,1);
        Mx[0]=1e9;
        rt=0;
        sum=n;
        get_rt(1,0);
        get_tree(rt,0,0);
    }
    int query(int x,int k){
        int ans=f1.Sum(x,0,k);
        for(int i=x;fa[i];i=fa[i]){
            if(k-Lca::dis(x,i)>=0){
                ans-=f2.Sum(i,0,k-Lca::dis(x,fa[i]));
                ans+=f1.Sum(fa[i],0,k-Lca::dis(x,fa[i]));
            }
        }return ans;
    }
}
void update(int x,int v){
    update(x,-val[x]);
    update(x,v);
    val[x]=v;
}


signed main(){
	// freopen("P6329_1.in","r",stdin); 
	read(n,m);
    for(int i=1;i<=n;i++) read(val[i]);
    for(int i=1,u,v;i<n;i++){
        read(u,v);
        V[u].push_back(v);
        V[v].push_back(u);
    }
   	Lca::init();
    int lst=0;
    while(m--){
        int opt,x,k;
        read(opt,x,k);
        x^=lst;
        k^=lst;
        if(opt==0){
            write(lst=Lca::query(x,k));
            putch('\n');
        }else{
            update(x,k);
        }
    }
	End();
} 
2024/5/24 15:04
加载中...