TLE求调
查看原帖
TLE求调
1163238
YWHHDJSer楼主2024/6/6 20:46

经过一系列的修改,终于是打对了正确性,但是不知道为什么T了。

#include<bits/stdc++.h>
using namespace std;
struct node0
{
	int h,to,quan;
}way[4000004];
struct node1
{
	int left,right,num,lazy1,lazy2;
}str[8000008];
int a,b[2000002],f[2000002],g,u,v,w,s[2000002],t[2000002];
int be[2000002],dfs[2000002],rks[2000002],gs[2000002],hd[2000002],cnt;
char in[11];
inline int lft(int x)
{
	return x<<1;
}
inline int iht(int x)
{
	return x<<1|1;
}
inline void ndin(int x,int y,int z)
{
	g++;
	way[g].quan=z;
	way[g].to=y;
	way[g].h=f[x];
	f[x]=g;
}
inline void pu(int x)
{
	str[x].num=max(str[lft(x)].num,str[iht(x)].num);
}
inline void pd1(int x)
{
	if(str[x].lazy1!=-1)
	{
		int lz=str[x].lazy1;
		str[x].lazy1=-1;
		str[lft(x)].lazy1=lz;
		str[iht(x)].lazy1=lz;
		str[lft(x)].lazy2=0;
		str[iht(x)].lazy2=0;
		str[lft(x)].num=lz;
		str[iht(x)].num=lz;
	}
}
inline void pd2(int x)
{
	if(str[x].lazy2>0)
	{
		int lz=str[x].lazy2;
		str[x].lazy2=0;
		str[lft(x)].lazy2+=lz;
		str[iht(x)].lazy2+=lz;
		str[lft(x)].num+=lz;
		str[iht(x)].num+=lz;
	}
}
void makstr(int x,int lt,int rt)
{
	str[x].left=lt;
	str[x].right=rt;
	str[x].lazy1=-1;
	str[x].lazy2=0;
	if(lt==rt)
	{
		str[x].num=b[rks[lt]];
		return;
	}
	int me=(lt+rt)>>1;
	makstr(lft(x),lt,me);
	makstr(iht(x),me+1,rt);
	pu(x);
}
void adstr1(int x,int lt,int rt,int y)
{
	if(lt<=str[x].left&&str[x].right<=rt)
	{
		str[x].num=y;
		str[x].lazy1=y;
		str[x].lazy2=0;
		return;
	}
	pd1(x);
	pd2(x);
	int me=(str[x].left+str[x].right)>>1;
	if(lt<=me)
	{
		adstr1(lft(x),lt,rt,y);
	}
	if(rt>me)
	{
		adstr1(iht(x),lt,rt,y);
	}
	pu(x);
}
void adstr2(int x,int lt,int rt,int y)
{
	if(lt<=str[x].left&&str[x].right<=rt)
	{
		str[x].num+=y;
		str[x].lazy2+=y;
		return;
	}
	pd1(x);
	pd2(x);
	int me=(str[x].left+str[x].right)>>1;
	if(lt<=me)
	{
		adstr2(lft(x),lt,rt,y);
	}
	if(rt>me)
	{
		adstr2(iht(x),lt,rt,y);
	}
	pu(x);
}
int foudstr(int x,int lt,int rt)
{
	if(lt<=str[x].left&&str[x].right<=rt)
	{
		return str[x].num;
	}
	pd1(x);
	pd2(x);
	int me=(str[x].left+str[x].right)>>1,rn=0;
	if(lt<=me)
	{
		rn=max(rn,foudstr(lft(x),lt,rt));
	}
	if(rt>me)
	{
		rn=max(rn,foudstr(iht(x),lt,rt));
	}
	return rn;
}
void dfs_1(int x)
{
	gs[x]=-1;
	s[x]=1;
	for(register int i=f[x];i>0;i=way[i].h)
	{
		int y=way[i].to;
		if(t[y]<=0)
		{
			b[y]=way[i].quan;
			t[y]=t[x]+1;
			be[y]=x;
			dfs_1(y);
			if(gs[x]==-1||s[gs[x]]<s[y])
			{
				gs[x]=y;
			}
		}
	}
	return;
}
void dfs_2(int x,int y)
{
	cnt++;
	hd[x]=y;
	dfs[x]=cnt;
	rks[cnt]=x;
	if(gs[x]==-1)
	{
		return;
	}
	dfs_2(gs[x],y);
	for(register int i=f[x];i>0;i=way[i].h)
	{
		int z=way[i].to;
		if(z!=be[x]&&z!=gs[x])
		{
			dfs_2(z,z);
		}
	}
	return;
}
inline void add1(int x,int y,int z)
{
	while(hd[x]!=hd[y])
	{
		if(t[hd[x]]<t[hd[y]])
		{
			swap(x,y);
		}
		adstr1(1,dfs[hd[x]],dfs[x],z);
		x=be[hd[x]];
	}
	if(t[x]<t[y])
	{
		swap(x,y);
	}
	adstr1(1,dfs[y]+1,dfs[x],z);
}
inline void add2(int x,int y,int z)
{
	while(hd[x]!=hd[y])
	{
		if(t[hd[x]]<t[hd[y]])
		{
			swap(x,y);
		}
		adstr2(1,dfs[hd[x]],dfs[x],z);
		x=be[hd[x]];
	}
	if(t[x]<t[y])
	{
		swap(x,y);
	}
	adstr2(1,dfs[y]+1,dfs[x],z);
}
inline int found(int x,int y)
{
	int rn=0;
	while(hd[x]!=hd[y])
	{
		if(t[hd[x]]<t[hd[y]])
		{
			swap(x,y);
		}
		rn=max(rn,foudstr(1,dfs[hd[x]],dfs[x]));
		x=be[hd[x]];
	}
	if(t[x]<t[y])
	{
		swap(x,y);
	}
	rn=max(rn,foudstr(1,dfs[y]+1,dfs[x]));
	return rn;
}
int main()
{
	freopen("tree.in","r",stdin);
	freopen("tree.out","w",stdout);
	scanf("%d",&a);
	for(register int i=1;i<a;i++)
	{
		scanf("%d%d%d",&u,&v,&w);
		ndin(u,v,w);
		ndin(v,u,w);
	}
	t[1]=1;
	dfs_1(1);
	dfs_2(1,1);
	makstr(1,1,cnt);
	while(scanf("%s",in))
	{
		if(in[0]=='C'&&in[1]=='h')
		{
			scanf("%d%d",&u,&v);
			int m=way[(u<<1)-1].to,n=way[u<<1].to;
			if(be[m]==n)
			{
				adstr1(1,dfs[m],dfs[m],v);
			}
			else
			{
				adstr1(1,dfs[n],dfs[n],v);
			}
		}
		if(in[0]=='C'&&in[1]=='o')
		{
			scanf("%d%d%d",&u,&v,&w);
			add1(u,v,w);
		}
		if(in[0]=='A')
		{
			scanf("%d%d%d",&u,&v,&w);
			add2(u,v,w);
		}
		if(in[0]=='M')
		{
			scanf("%d%d",&u,&v);
			printf("%d\n",found(u,v));
		}
		if(in[0]=='S')
		{
			fclose(stdin);
			fclose(stdout);
			return 0;
		}
	}
}

调了至少一个小时,但是不知道是哪里出了问题。

2024/6/6 20:46
加载中...