TLE/MLE on #3#15,求调
查看原帖
TLE/MLE on #3#15,求调
1034667
Elysian_Realme楼主2024/6/12 20:30

rt

// Problem: P4381 [IOI2008] Island
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P4381
// Memory Limit: 250 MB
// Time Limit: 1000 ms
// 
// By:lmq
// AC Time:2024-06-12 16:21:58

#include <bits/stdc++.h>
#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-48;ch=getchar();}
	return x*f;
}
const int N=1e6+5e5;
struct edge{
	signed v;
	int w;
	signed id;
};
struct node{
	int val;
	signed id;
};
int n,ans;
bool hd[N];
bool vis[N],ved[N];
map<pair<signed,signed>,int> mp;
vector<signed> h;
vector<int> s,d;
vector<edge> g[N];
deque<node> q;
int dfs_zh(int u){
	vis[u]=1;
	for(edge i:g[u]){
		if(ved[i.id])continue;
		ved[i.id]=1;
		int v=i.v;
		if(!vis[v]){
			int t=dfs_zh(v);
			if(t){
				if(t!=-1){
					mp[{u,v}]=max(i.w,mp[{u,v}]);
					mp[{v,u}]=max(i.w,mp[{v,u}]);
					hd[u]=1;
					h.push_back(u);
				}
				return t==-1||t==u?-1:t;
			}
		}else{
			hd[u]=1;
			mp[{u,v}]=max(i.w,mp[{u,v}]);
			mp[{v,u}]=max(i.w,mp[{v,u}]);
			h.push_back(u);
			return v;
		}
	}
	return 0;
}
pair<int,int> dfs_lst(int u,int fa,int rt){
	vis[u]=1;
	int s=0,ret=0;
	s=u;
	for(edge i:g[u]){
		int v=i.v,w=i.w;
		if((!hd[v]||v==rt)&&v!=fa){
			pair<int,int> t=dfs_lst(v,u,rt);
			int sv=t.first,st=t.second;
			if(st+w>ret)
				ret=st+w,s=sv;
		}
	}
	return {s,ret};
}
inline int trd(int u){
	return dfs_lst(dfs_lst(u,u,u).first,-1,u).second;
}
int work(int u){
	int ret=0;
	q.clear();
	d.clear();
	s.clear();
	h.clear();
	mp.clear();
	dfs_zh(u);
	int l=h.size();
	for(int i=0;i<l;i++)
		h.push_back(h[i]);
	s.push_back(0);
	for(int i=1;i<h.size();i++)
		s.push_back(mp[{h[i-1],h[i]}]);
	for(int i=1;i<s.size();i++)
		s[i]+=s[i-1];
	for(int rt:h){
		ret=max(ret,trd(rt));
		d.push_back(dfs_lst(rt,rt,rt).second);
	}
	for(int i=1;i<h.size();i++){
		while(!q.empty()&&q.front().id<i-l+1)
			q.pop_front();
		while(!q.empty()&&q.back().val<d[i-1]-s[i-1])
			q.pop_back();
		q.push_back({d[i-1]-s[i-1],i-1});
		ret=max(ret,d[i]+s[i]+q.front().val);
	}
	return ret;
}
signed main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		int v=read(),w=read();
		g[i].push_back({v,w,i});
		g[v].push_back({i,w,i});
	}
	for(int i=1;i<=n;i++)
		if(!vis[i])
			ans+=work(i);
	cout<<ans<<endl;
	return 0;
}
// 某一日,祂从天坠落。人们抬头仰望,于是看见了星空。
// 星月送来神的女儿,她愿成为人的伴侣。
// 长风化作她的轺车,四海落成她的园圃。鸟雀衔来善的种子,百花编织爱的颂歌。
// 她便是这样降生于世,行于大地,与人类一同长大,与世界一起发芽。
// 而今,「终焉」之时将至。
// 而今,「归去」之时已至。
// 就此告别吧,美丽的世界。
// 此后,将有「群星」闪耀,因为我如今来过。
// 此后,将有「百花」绽放,因为我从未离去。
// 请将我的箭、我的花、与我的爱,织成新生的种子,带向那枯萎的大地。
// 然后,便让它开出永恒而无瑕的…「人性之华」吧。
// 「我名为爱莉希雅……」
// 「最初的律者,人之律者。」
2024/6/12 20:30
加载中...