救救孩子吧,只有5分
查看原帖
救救孩子吧,只有5分
253738
听取MLE声一片楼主2021/10/2 23:09

看第一篇题解的思路写的

炸了

#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<cstring>
#include<algorithm>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#include<ctime>
#include<complex>
#define int long long
using namespace std;
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-'0';ch=getchar();}
	return x*f;
}
const int N=2e6+10;
int n,cnt,s,ans,st,s1,s2;
int tot,head[N],val[N],to[N],nex[N];
int vis[N],book[N],r[N];
int dis[N],f[N],sum[N];
inline void add(int u,int v,int w){
	to[++tot]=v;
	val[tot]=w;
	nex[tot]=head[u];
	head[u]=tot;
}
inline bool dfs1(int u,int fa){
	if(vis[u]==1){
		vis[u]=2;
		r[++cnt]=u;
		book[u]=1;
		return 1;
	}
	vis[u]=1;
	for(int i=head[u];i;i=nex[i]){
		if(i==((fa-1)^1)+1)
			continue;
		if(dfs1(to[i],i)){
			int w=val[i];
			if(vis[u]!=2){
				sum[++cnt]=sum[cnt-1]+w;
				r[cnt]=u;
				book[u]=1;
				return 1;
			}
			else{
				sum[st-1]=sum[st]-w;
				return 0;
			}
		}
	}
	return 0;		
}
inline void dfs2(int u){
	book[u]=1;
	for(int i=head[u];i;i=nex[i]){
		int v=to[i];
		if(book[v])
			continue;
		dfs2(v);
		s=max(s,dis[u]+dis[v]+val[i]);
		dis[u]=max(dis[u],dis[v]+val[i]);
	}
}
inline int solve(int root){
	st=cnt+1;
	s1=0,s2=0;
	dfs1(root,0);
	for(int i=st;i<=cnt;i++){
		s=0;
		dfs2(r[i]);
		s1=max(s1,s);
		int x=i+cnt-st+1;
		f[x]=f[i]=dis[r[i]];
		sum[x]=sum[x-1]+sum[i]-sum[i-1];
	}
	deque<int> q;
	for(int i=st;i<=2*cnt-st+1;i++){
		while(!q.empty()&&q.front()<=i-cnt+st-1)
			q.pop_front();
		if(!q.empty())
			s2=max(s2,f[i]+f[q.front()]+sum[i]-sum[q.front()]);
		while(!q.empty()&&f[q.back()]-sum[q.back()]<=f[i]-sum[i])
			q.pop_back();
		q.push_back(i);
	}
	return max(s1,s2);
}
signed main()
{
	n=read();
	for(int i=1;i<=n;i++){
		int v=read(),w=read();
		add(i,v,w);
		add(v,i,w);
	}
	for(int i=1;i<=n;i++)
		if(!book[i])
			ans+=solve(i);
	printf("%lld",ans);
	return 0;
}

2021/10/2 23:09
加载中...