LCT RE求助
查看原帖
LCT RE求助
371818
juruo999楼主2022/11/5 20:50

记录

SIGSEGV,代码如下

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;

typedef long long ll;
const ll inf=1145141919810000;
const int N=100005;

void Max(ll& a,const ll& b){ if(a<b) a=b; }

struct Mat{
	ll a[3][3];
	Mat(ll x=0,int k=1){
		a[1][1]=k*x;
		if(x<=0) a[0][2]=a[0][1]=a[1][2]=x;
		else a[0][2]=a[0][1]=a[1][2]=k*x;
		a[0][0]=a[2][2]=0;
		a[1][0]=a[2][0]=a[2][1]=-inf;
	}
	#define _(i,j) r.a[i][j]=max(a[i][0]+o.a[0][j],max(a[i][1]+o.a[1][j],a[i][2]+o.a[2][j]))
	Mat operator*(const Mat& o)const{
		Mat r;
		_(0,0);_(0,1);_(0,2);
		_(1,0);_(1,1);_(1,2);
		_(2,0);_(2,1);_(2,2);
		return r;
	}
	#undef _
	ll ans()const{
		return max(max(a[0][0],a[0][1]),a[0][2]);
	}

	void out()const{
		for(int i=0;i<3;i++){
			for(int j=0;j<3;j++) cout<<a[i][j]<<"\t";
			cout<<"\n";
		}
		cout<<"\n";
	}
};
Mat I;

int n,q;

namespace Cms{

    const int N=300005;
    int fa[N],ch[N][2],siz[N];
	bool iv[N];ll b[N];
	Mat a[N],s[N];
    #define ls ch[u][0]
    #define rs ch[u][1]
	#define il inline
	il void pushup(int u){
		siz[u]=siz[ls]+siz[rs]+1;
		s[u]=s[ls]*a[u]*s[rs];
	}
	il void applyiv(int u){ iv[u]^=1;swap(ls,rs); }
	il void applyst(int u,ll x){ b[u]=x;a[u]=Mat(x);s[u]=Mat(x,siz[u]); }
	il void pushdown(int u){
		if(iv[u]){
			iv[u]^=1;
			if(ls) applyiv(ls);
			if(rs) applyiv(rs);
		}
		if(b[u]<inf){
			if(ls) applyst(ls,b[u]);
			if(rs) applyst(rs,b[u]);
			b[u]=inf;
		}
	}
    il bool isrt(int u){ return fa[u]==0 || (ch[fa[u]][0]!=u && ch[fa[u]][1]!=u); }
    il bool get(int u){ return ch[fa[u]][1]==u; }
    void upd(int u){
        if(!isrt(u)) upd(fa[u]);
        pushdown(u);
    }

    il void rotate(int u){
        int v=fa[u],w=fa[v],c=ch[v][1]==u;
        if(!isrt(v)) ch[w][ch[w][1]==v]=u;
        ch[v][c]=ch[u][c^1];fa[ch[u][c^1]]=v;
        ch[u][c^1]=v;fa[v]=u;fa[u]=w;
        pushup(v);pushup(u);
    }
    il void splay(int u){
        upd(u);
        for(int f;f=fa[u],!isrt(u);rotate(u)){
            if(!isrt(f)) rotate((get(u)==get(f))?f:u);
        }
    }
    il void access(int u){
        for(int p=0;u;p=u,u=fa[u]){
            splay(u);ch[u][1]=p;pushup(u);
        }
    }
    il void makert(int u){
        access(u);splay(u);applyiv(u);
    }
    il void split(int u,int v){
        makert(u);access(v);splay(v);
    }
    il void link(int u,int v){
        makert(u);fa[u]=v;
    }
}
using namespace Cms;

int main(){
	
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);

	for(int i=0;i<3;i++) for(int j=0;j<3;j++) I.a[i][j]=-inf;
	for(int i=0;i<3;i++) I.a[i][i]=0;
	s[0]=I;
	
	cin>>n;
	for(int i=1;i<=n;i++){
		ll x;cin>>x;a[i]=Mat(x);b[i]=inf;pushup(i);
		// cout<<"-- -- "<<i<<" -- --\n";
		// a[i].out();s[i].out();
	}
	for(int i=1;i<n;i++){
		int u,v;cin>>u>>v;link(u,v);
	}

	cin>>q;
	while(q--){
		int op,x,y;cin>>op>>x>>y;
		if(op==1){
			split(x,y);
			cout<<s[y].ans()<<"\n";
		}else{
			ll x;cin>>x;
			split(x,y);
			applyst(y,x);
		}
	}

	// (Mat(-2)*Mat(-3)*Mat(2)*Mat(3)).out();

	return 0;
}
2022/11/5 20:50
加载中...