ac3个点,剩下的tle,不知道是哪里卡常了呜呜呜
查看原帖
ac3个点,剩下的tle,不知道是哪里卡常了呜呜呜
628403
Stupid_CCCat楼主2022/12/9 19:33
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=300009;
typedef struct node
{
	int to,num;
}N;
struct nd
{
	int l,r,sum,maxn,minn,lz;
}tr[maxn*4];
struct nnd
{
	int s1,s2,num;
}in[maxn];
int n,m,tim=0;
vector<N> edge[maxn];
int fa[maxn],w[maxn],v[maxn],hson[maxn],top[maxn];
int size[maxn],dfn[maxn],rnk[maxn],dep[maxn];
void dfs1(int i,int t);
void dfs2(int i,int t);
void build(int i,int l,int r);
void chg1(int i,int l,int r); 
void chg2(int i,int t,int x);
void push_down(int i);
int findsum(int i,int l,int r);
int findmax(int i,int l,int r);
int findmin(int i,int l,int r);
void c1();
void c2();
void c3();
void c4();
void c5();
inline int read();
int main()
{
	cin>>n;
	for(int t=1;t<n;t++)
	{
		N pro;
		in[t].s1=read();in[t].s2=read();in[t].num=read();
		pro.num=in[t].num;
		pro.to=in[t].s2;
		edge[in[t].s1].push_back(pro);
		pro.to=in[t].s1;
		edge[in[t].s2].push_back(pro);
	}
	dfs1(0,-1);
	dfs2(0,0);
	m=read();
	build(1,1,n);
	while(m--)
	{
		char str[5];
		scanf("%s",str);
		if(str[0]=='C')
		c1();
		else if(str[0]=='N')
		c2();
		else if(str[0]=='S')
		c3();
		else if(str[1]=='A')
		c4();
		else
		c5();
	}
}
void dfs1(int i,int t)
{
	if(t==-1)dep[i]=1;
	else dep[i]=dep[t]+1; 
	hson[i]=-1;
	fa[i]=t;
	size[i]=1;
	int maxsize=-1;
	for(vector<N>::iterator it=edge[i].begin();it!=edge[i].end();it++)
	{
		N pro=*it;
		if(pro.to!=t)
		{
			w[pro.to]=pro.num;
			dfs1(pro.to,i);
			size[i]+=size[pro.to];
			if(maxsize<size[pro.to])
			{
				maxsize=size[pro.to];
				hson[i]=pro.to;
			}
		}
	}
	return;
}
void dfs2(int i,int t)
{
	tim++;
	dfn[i]=tim;
	rnk[tim]=i;
	v[tim]=w[i];
	top[i]=t;
	if(hson[i]==-1)return;
	dfs2(hson[i],t);
	for(vector<N>::iterator it=edge[i].begin();it!=edge[i].end();it++)
	{
		N pro=*it;
		if(pro.to!=fa[i]&&pro.to!=hson[i])
		dfs2(pro.to,pro.to);
	}
	return;
}
void build(int i,int l,int r)
{
	tr[i].l=l;tr[i].r=r;tr[i].lz=0;
	if(l==r)
	{
		tr[i].maxn=v[l];
		tr[i].minn=v[l];
		tr[i].sum=v[l];
		return;
	}
	int lson=i<<1;
	int rson=i<<1|1;
	int mid=(l+r)>>1;
	build(lson,l,mid);
	build(rson,mid+1,r);
	tr[i].maxn=max(tr[lson].maxn,tr[rson].maxn);
	tr[i].minn=min(tr[lson].minn,tr[rson].minn);
	tr[i].sum=tr[lson].sum+tr[rson].sum;
	return;
}
void chg1(int i,int l,int r)
{
	if(tr[i].l>r||tr[i].r<l)return;
	if(l<=tr[i].l&&tr[i].r<=r)
	{
		tr[i].lz^=1;
		tr[i].sum=-tr[i].sum;
		swap(tr[i].maxn,tr[i].minn);
		tr[i].maxn=-tr[i].maxn;
		tr[i].minn=-tr[i].minn;
		return;
	}
	push_down(i);
	int lson=i<<1;
	int rson=i<<1|1;
	chg1(lson,l,r);
	chg1(rson,l,r);
	tr[i].maxn=max(tr[lson].maxn,tr[rson].maxn);
	tr[i].minn=min(tr[lson].minn,tr[rson].minn);
	tr[i].sum=tr[lson].sum+tr[rson].sum;
	return;
}
void chg2(int i,int t,int x)
{
	if(tr[i].l>t||tr[i].r<t)return;
	if(tr[i].l==tr[i].r&&tr[i].l==t)
	{
		tr[i].sum=x;
		tr[i].maxn=x;
		tr[i].minn=x;
		return;
	}
	push_down(i);
	int lson=i<<1;
	int rson=i<<1|1;
	chg2(lson,t,x);
	chg2(rson,t,x);
	tr[i].maxn=max(tr[lson].maxn,tr[rson].maxn);
	tr[i].minn=min(tr[lson].minn,tr[rson].minn);
	tr[i].sum=tr[lson].sum+tr[rson].sum;
	return;
}
void push_down(int i)
{
	if(tr[i].lz)
	{
		int lson=i<<1;
	    int rson=i<<1|1;
		tr[lson].lz^=tr[i].lz;
		tr[rson].lz^=tr[i].lz;
		tr[lson].sum=-tr[lson].sum;
		tr[rson].sum=-tr[rson].sum;
		swap(tr[lson].maxn,tr[lson].minn);
		swap(tr[rson].maxn,tr[rson].minn);
		tr[lson].maxn=-tr[lson].maxn;
		tr[rson].maxn=-tr[rson].maxn;
		tr[lson].minn=-tr[lson].minn;
		tr[rson].minn=-tr[rson].minn;
		tr[i].lz=0;
	}
	return;
}
int findsum(int i,int l,int r)
{
	if(l>tr[i].r||tr[i].r<l)return 0;
	int res=0;
	if(l<=tr[i].l&&tr[i].r<=r)
	return tr[i].sum;
	push_down(i);
	return findsum(i<<1,l,r)+findsum(i<<1|1,l,r);
}
int findmax(int i,int l,int r)
{
	if(l>tr[i].r||tr[i].r<l)return -100000;
	if(l<=tr[i].l&&tr[i].r<=r)
	return tr[i].maxn;
	push_down(i);
	return max(findmax(i<<1,l,r),findmax(i<<1|1,l,r));
}
int findmin(int i,int l,int r)
{
	if(l>tr[i].r||tr[i].r<l)return 100000;
	if(l<=tr[i].l&&tr[i].r<=r)
	return tr[i].minn;
	push_down(i);
	return min(findmin(i<<1,l,r),findmin(i<<1|1,l,r));
}
void c1()
{
	int xi,b1,b2,x;
	xi=read();x=read();
	b1=in[xi].s1;
	b2=in[xi].s2;
	if(dep[b1]<dep[b2])
	swap(b1,b2);
	chg2(1,dfn[b1],x);
	return;
}
void c2()
{
	int u,v;
	u=read();v=read();
	while(top[u]!=top[v])
	{
		if(dep[top[u]]<dep[top[v]])
		swap(u,v);
		chg1(1,dfn[top[u]],dfn[u]);
		u=fa[top[u]]; 
	} 
	if(u!=v)
	{
		if(dep[u]<dep[v])
	    swap(u,v);
	    chg1(1,dfn[v]+1,dfn[u]);
	}
	return;
}
void c3()
{
	int res=0;
	int u,v;
	u=read();v=read();
	while(top[u]!=top[v])
	{
		if(dep[top[u]]<dep[top[v]])
		swap(u,v);
		res+=findsum(1,dfn[top[u]],dfn[u]);
		u=fa[top[u]]; 
	} 
	if(u!=v)
	{
		if(dep[u]<dep[v])
	    swap(u,v);
	    res+=findsum(1,dfn[v]+1,dfn[u]);
	}
	printf("%d\n",res);
	return;
}
void c4()
{
	int res=-100000;
	int u,v;
	u=read();v=read();
	while(top[u]!=top[v])
	{
		if(dep[top[u]]<dep[top[v]])
		swap(u,v);
		res=max(res,findmax(1,dfn[top[u]],dfn[u]));
		u=fa[top[u]]; 
	} 
	if(u!=v)
	{
		if(dep[u]<dep[v])
	    swap(u,v);
	    res=max(res,findmax(1,dfn[v]+1,dfn[u]));
	}
	printf("%d\n",res);
	return;
}
void c5()
{
	int res=100000;
	int u,v;
	u=read();v=read();
	while(top[u]!=top[v])
	{
		if(dep[top[u]]<dep[top[v]])
		swap(u,v);
		res=min(res,findmin(1,dfn[top[u]],dfn[u]));
		u=fa[top[u]]; 
	} 
	if(u!=v)
	{
		if(dep[u]<dep[v])
	    swap(u,v);
	    res=min(res,findmin(1,dfn[v]+1,dfn[u]));
	}
	printf("%d\n",res);
	return;
}
inline int read()
{
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
	return x*f;
}
2022/12/9 19:33
加载中...