求查错/dk
查看原帖
求查错/dk
239358
Velix楼主2020/10/28 20:39

灵异般地所有点都TLE了

估计是哪里死循环了,但看不出来/kk

代码:

#include<bits/stdc++.h>
using namespace std;
#define N 1000001
long long n,done[N],vis[N],head[N],f[N],hoop[N],hval[N],que[2*N],s[2*N],num,ans,cnt,tot=1,final;
struct qq{
	long long to,next,dis;
}a[N*2];
void add(int x,int y,int z){a[++tot].to=y;a[tot].dis=z;a[tot].next=head[x];head[x]=tot;}
int predfs(int x,int fa,int dis)
{
	if(vis[x]){final=x;return 1;}
	vis[x]=1;
	for(int i=head[x];i;i=a[i].next)
		if((i^1)!=fa)
		if(predfs(a[i].to,i,a[i].dis))
		{
			hoop[++num]=x;
			hval[num]=dis;
			//cout<<x<<' '<<i<<' '<<fa<<' '<<dis<<endl;
			if(x!=final)return 1;
			return 0;
		}
	return 0;
}
int dfs(int x)
{
	done[x]=1;
	for(int i=head[x];i;i=a[i].next)
		if(!done[a[i].to])
		{
			long long y=dfs(a[i].to);
			cnt=max(cnt,f[x]+a[i].dis+y);
			f[x]=max(f[x],a[i].dis+y);
		}
}
int main()
{
	int x,y,z;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		scanf("%lld%lld",&x,&y);
		add(i,x,y);add(x,i,y);
	}
	for(int i=1;i<=n;i++)
		if(!done[i])
		{
			num=cnt=0;
			predfs(i,0,0);
			for(int i=1;i<=num;i++)done[hoop[i]]=1;
			for(int i=1;i<=num;i++)f[i]=0;
			for(int i=1;i<=num;i++)dfs(hoop[i]);
			int h=1,t=0;
			for(int i=1;i<=num*2;i++)
				s[i]=s[i-1]+hval[(i-1)%num+1];
			for(int i=1;i<num*2;i++)
			{
				while(h<=t&&que[h]<=i-num)h++;
				cnt=max(cnt,s[i]+f[i]+f[que[h]]-s[que[h]]);
				while(h<=t&&f[i]-s[i]>=f[que[t]]-s[que[t]])t--;
				que[++t]=i;
			}
			ans+=cnt;
			/*for(int i=1;i<=num;i++)cout<<hoop[i]<<' ';cout<<endl;
			for(int i=1;i<=2*num;i++)cout<<f[i]<<' ';cout<<endl;
			for(int i=1;i<=2*num;i++)cout<<s[i]<<' ';
			cout<<endl<<cnt<<endl;*/
		}
	cout<<ans;
}
2020/10/28 20:39
加载中...