A了3个,全TLE了
查看原帖
A了3个,全TLE了
291604
王茗仟楼主2023/2/15 17:24

#include<bits/stdc++.h>
#define double long double
#define int128 __int128
#define int long long
#define re register
#define in inline
#define Pi pair<int,int>
#define vi vector<int>
#define max(a,b)  ((a)>(b)?a:b)
#define min(a,b)  ((a)<(b)?a:b)
#define ls x<<1
#define rs x<<1|1
#define mid ((l+r)>>1)
#define dx x+xx[i]
#define dy y+yy[i]
#define debug cout<<"wuyu"<<endl;
using namespace std;
const int INF=0x3f3f3f3f3f;
const int N=2e5+19;
const int M=1e6+10;
const int mod=998244353;
const double eps=1e-5;
in int read(){	re int x=0,f=0;re char c=getchar();	while(!isdigit(c)) f|=(c=='-'),c=getchar();	while(isdigit(c))  x=(x<<3)+(x<<1)+c-'0',c=getchar();	return f?-x:x;}
in void write(re int x){	if(x<0) putchar('-'),x=-x;	if(x>9) write(x/10);	putchar(x%10+'0');}



int n,m;
struct edge{
	int u,v,w;
	int nx;
}e[M<<2];
int head[N<<2],tot;


in void add(re int u,re int v,re int w){
	e[++tot].u=u;
	e[tot].v=v;
	e[tot].w=w;
	e[tot].nx=head[u];
	head[u]=tot;
}

int idx,fa[N],son[N],top[N],siz[N],id[N],w[N],wt[N],dep[N];

void dfs1(re int u,re int f,re int depth){
	dep[u]=depth;
	fa[u]=f;
	siz[u]=1;
	re int maxson=-1;
	for(re int i=head[u];i;i=e[i].nx){
		re int v=e[i].v;
		if(v==f) continue;
		dfs1(v,u,depth+1);
		w[v]=e[i].w;
		siz[u]+=siz[v];
		if(siz[v]>maxson){
			son[u]=v;
			maxson=siz[v];
		}
	}
}

void dfs2(re int u,re int topf){
	id[u]=++idx;
	wt[id[u]]=w[u];
	top[u]=topf;
	if(!son[u]) return ;
	dfs2(son[u],topf);
	for(re int i=head[u];i;i=e[i].nx){
		re int v=e[i].v;
		if(v==fa[u]||v==son[u]) continue;
		dfs2(v,v);
	}
	return ;
}

int sumn[N<<2],maxn[N<<2],minn[N<<2],lazy[N<<2];



in void pushup(re int x){
	sumn[x]=sumn[ls]+sumn[rs];
	maxn[x]=max(maxn[ls],maxn[rs]);
	minn[x]=min(minn[ls],minn[rs]);
}

void build(re int x,re int l,re int r){
	if(l==r){
		sumn[x]=maxn[x]=minn[x]=wt[l];
		return ;
	}
	build(ls,l,mid);
	build(rs,mid+1,r);
	pushup(x);
}

in void pushdown(re int x){
	if(lazy[x]){
		lazy[ls]^=1;lazy[rs]^=1;
		sumn[ls]=-sumn[ls];sumn[rs]=-sumn[rs];
		maxn[ls]=-maxn[ls];maxn[rs]=-maxn[rs];
		minn[ls]=-minn[ls];minn[rs]=-minn[rs];
		swap(maxn[ls],minn[ls]);
		swap(maxn[rs],minn[rs]);
		lazy[x]=0;
	}
}

in void update(re int x,re int l,re int r,re int L,re int k){
	if(l==r){
		sumn[x]=maxn[x]=minn[x]=k;
		return;
	}
	pushdown(x);
	if(L<=mid) update(ls,l,mid,L,k);
	if(L>mid)  update(rs,mid+1,r,L,k);
	pushup(x);
}

void change(re int x,re int l,re int r,re int L,re int R){
	if(L<=l&&R>=r){
		lazy[x]^=1;
		sumn[x]=-sumn[x];
		maxn[x]=-maxn[x];
		minn[x]=-minn[x];
		swap(maxn[x],minn[x]);
		return ;
	}
	pushdown(x);
	if(L<=mid) change(ls,l,mid,L,R);
	if(R>mid)  change(rs,mid+1,r,L,R);
	pushup(x);
}

in int qsum(re int x,re int l,re int r,re int L,re int R){
	int res=0;
	if(L<=l&&R>=r){
		return sumn[x];
	}
	pushdown(x);
	if(L<=mid) res+=qsum(ls,l,mid,L,R);
	if(R>mid)  res+=qsum(rs,mid+1,r,L,R);
	pushup(x);
	return res;
}

in int qmax(re int x,re int l,re int r,re int L,re int R){
	int res=-INF;
	if(L<=l&&R>=r) {
		return maxn[x];
	}
	pushdown(x);
	if(L<=mid)res=max(res,qmax(ls,l,mid,L,R));
	if(R>mid) res=max(res,qmax(rs,mid+1,r,L,R));
	pushup(x);
	return res;
}

int qmin(re int x,re int l,re int r,re int L,re int R){
	int res=INF;
	if(L<=l&&R>=r){
		return minn[x];
	}
	pushdown(x);
	if(L<=mid) res=min(res,qmin(ls,l,mid,L,R));
	if(R>mid)  res=min(res,qmin(rs,mid+1,r,L,R));
	pushup(x);
	return res;
}



//

in void update(re int x,re int y){
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		change(1,1,n,id[top[x]],id[x]);
		x=fa[top[x]];
	}
	if(dep[x]>dep[y]) swap(x,y);
	if(x!=y) change(1,1,n,id[x]+1,id[y]);
}

in int qsum(re int x,re int y){
	int res=0;
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		res+=qsum(1,1,n,id[top[x]],id[x]);
		x=fa[top[x]];
	}
	if(dep[x]>dep[y]) swap(x,y);
	if(x!=y) res+=qsum(1,1,n,id[x]+1,id[y]);
	/*要判断是否重合,重合的话就不用算了,+1就下面去了abb*/
	return res;
}

in int qmax(re int x,re int y){
	int res=-INF;
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		res=max(res,qmax(1,1,n,id[top[x]],id[x]));
		x=fa[top[x]];
	}
	if(dep[x]>dep[y]) swap(x,y);
	if(x!=y) res=max(res,qmax(1,1,n,id[x]+1,id[y]));
	return res;
}

in int qmin(re int x,re int y){
	int res=INF;
	while(top[x]!=top[y]){
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		res=min(res,qmin(1,1,n,id[top[x]],id[x]));
		x=fa[top[x]];
	}
	if(dep[x]>dep[y]) swap(x,y);
	if(x!=y) res=min(res,qmin(1,1,n,id[x]+1,id[y]));
	return res;
}

struct node{
	int x,y;
}idd[N];


signed main(){
	n=read();
	for(re int i=1;i<n;i++){
		re int x,y,z;
		x=read()+1;y=read()+1;z=read();
		add(x,y,z);add(y,x,z);
		idd[i].x=x;idd[i].y=y;
	}
	dfs1(1,0,1);dfs2(1,1);
	build(1,1,n);
	m=read();
	
	while(m--){
		re char s[10];
		scanf("%s",&s);
		re int x,y;
		x=read();y=read();
		if(s[0]=='C'){
			re int z;
			if(dep[idd[x].x]>dep[idd[x].y]) z=idd[x].x;
			else z=idd[x].y;
			update(1,1,n,id[z],y);
		}
		else if(s[0]=='N'){
			x++;y++;
			update(x,y);
		}
		else if(s[0]=='S'){
			x++;y++;
			write(qsum(x,y));
			putchar(10);
		}
		else if(s[0]=='M'){
			if(s[1]=='A'){
				x++;y++;
				write(qmax(x,y));
				putchar(10);
			}
			else if(s[1]=='I'){
				x++;y++;
				write(qmin(x,y));
				putchar(10);
			}
		}
	}
	return 0;
}



救救我吧

2023/2/15 17:24
加载中...