灵异般地所有点都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;
}