P4381 [IOI2008] Island

P4381 [IOI2008] Island

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int M=1e6+5;
int n;
int h[M],ne[M<<1],e[M<<1],w[M<<1],tot=1;
int a[M<<1],sum[M<<1],cnt;
bool vis[M<<1],st[M<<1];
void add(int from,int to,int wi) {
e[++tot]=to; w[tot]=wi; ne[tot]=h[from]; h[from]=tot;
}
bool dfs1(int now,int fa) {
if(vis[now]) {
st[now]=1;
a[++cnt]=now;
return 1;
}
vis[now]=1;
for(int i=h[now];i;i=ne[i]) {
if((i^1)==fa)continue;
if(dfs1(e[i],i)) {
if(st[now]==0) {
st[now]=1;
a[++cnt]=now;
sum[cnt]=w[i];
return 1;
}
else {
sum[1]=w[i];
return 0;
}
}
}
return 0;
}
int dep[M],dis;
void dfs2(int now,int fa) {
vis[now]=1;
for(int i=h[now];i;i=ne[i]) {
int to=e[i];
if(to==fa||st[to])continue;
dfs2(to,now);
dis=max(dis,dep[to]+w[i]+dep[now]);
dep[now]=max(dep[to]+w[i],dep[now]);
}
}
int f[M<<1];
int fun(int root) {
cnt=dis=0;
dfs1(root,0);
// for(int i=1;i<=cnt;i++)cout<<sum[i]<<' ';cout<<endl;
for(int i=1;i<=cnt;i++)sum[i]=sum[i-1]+sum[i];
for(int i=1,j=cnt+1;i<=cnt;i++,j++)sum[j]=sum[j-1]+(sum[i]-sum[i-1]);
for(int i=1;i<=cnt;i++) {
dfs2(a[i],0);
f[i]=f[i+cnt]=dep[a[i]];
}
// for(int i=1;i<=2*cnt;i++)cout<<sum[i]<<' ';cout<<endl;
deque<int>q;
for(int i=1;i<=2*cnt;i++) {
while(!q.empty()&&q.front()+cnt<=i)q.pop_front();
if(!q.empty())dis=max(dis,sum[i]-sum[q.front()]+f[i]+f[q.front()]);
while(!q.empty()&&f[i]-sum[i]>=f[q.back()]-sum[q.back()])q.pop_back();
// cout<<i<<' '<<q.size()<<endl;
q.push_back(i);
}
// cout<<dis<<endl;
return dis;
}
void solve() {
cin>>n;
for(int i=1;i<=n;i++) {
int x,wi;
cin>>x>>wi;
add(i,x,wi);
add(x,i,wi);
}
int ans=0;
for(int i=1;i<=n;i++) {
if(!vis[i])ans+=fun(i);
}
cout<<ans<<endl;
}
signed main() {
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
solve();
return 0;
}
posted @   basicecho  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示