首页 > 其他分享 >P4381 [IOI2008] Island 基环树

P4381 [IOI2008] Island 基环树

时间:2024-11-09 09:46:16浏览次数:1  
标签:IOI2008 rt 1000010 int Island sum max1 max P4381

P4381 [IOI2008] Island

由于每个点只能向外连一条边,\(n\) 个点 \(n\) 条边,中间有环,故不能再向外连边,所以构成基环内向树森林。

叶子节点入度为 \(0\),故可以判断叶子结点,倒推回环根,存每个子树的最大深度。

最终 dp 处理每个基环树的环,分两种情况:

  • 经过环:分两种情况:顺时针和逆时针,前缀和优化跑一边即可。
  • 不经过环:答案为子树直径
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n;
int a[1000010],w[1000010];
int ind[1000010];
queue<int> q;
int l[1000010],d[1000010];
bool vis[1000010];
int ans;
int max(int a,int b,int c){
	return max(a,max(b,c));
}
int solve(int rt){
	int p=rt;
	int max1=l[rt],max2=l[rt],ret1=0,ret2=-2147483648,ret3=d[rt];
	int sum=w[rt];
	while((p=a[p])!=rt){
		vis[p]=1;
		ret1=max(ret1,l[p]+sum+max1);
		ret2=max(ret2,l[p]-sum+max2);
		ret3=max(ret3,d[p]);
		max1=max(max1,l[p]-sum);
		max2=max(max2,l[p]+sum);
		sum+=w[p];
	}
	return max(ret1,ret2+sum,ret3);
}
signed main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i]>>w[i];
		ind[a[i]]++;
	}
	for(int i=1;i<=n;i++)if(!ind[i])q.push(i);
	while(!q.empty()){
		int u=q.front();q.pop();
		int v=a[u];
		d[v]=max(d[v],d[u],l[v]+l[u]+w[u]);
		l[v]=max(l[v],l[u]+w[u]);
		ind[v]--;
		if(!ind[v])q.push(v);
	}
	for(int i=1;i<=n;i++){
		if(ind[i]&&!vis[i])ans+=solve(i);
	}
	cout<<ans;
	return 0;
}

标签:IOI2008,rt,1000010,int,Island,sum,max1,max,P4381
From: https://www.cnblogs.com/UserJCY/p/18536352/jt_pseudotree_P4381

相关文章

  • [IOI2008] Island
    算法题意可以转化成给定一个基环树森林,求每颗基环树上的直径长度之和找环按照基环树的方法找即可求直径(i)直径不经过环对于以环上每一个点的子树,记录直径即可(ii)直径经过环断环为链,考虑单调队列处理,具体的关于为什么需要断环为链:方便快速处理环上两点间......
  • 来了解一下 Island Architecture 孤岛架构
    原文标题:IslandArchitecture原文:IslandArchitecture|MainaWycliffeBlog作者:MainaWycliffe建立一个网站有不同的方法,其中之一便是多页应用程序(MPA),它大约在十年前就过时了,现在又重新流行起来。MPA已经被Angular和React以及其他现代框架所普及的单页应用(SPA)方......
  • D. Determine Winning Islands in Race
    https://codeforces.com/contest/1998/problem/D思路:求出到达每个点的最短路径,然后从每个点i考虑跳跃到点j(i->j有边),i+1默认为必胜态,则必败态为j-从1~j的步数。如果必败态所在的位置>必胜态,则更新差分数组,最后求和即可。总结:一开始只考虑了从1~j的步数只能是1步1步走的,没考虑......
  • 题解:CF634A Island Puzzle
    CF634AIslandPuzzle题解分析由于我们仅能移动\(0\),所以其它数字的相对顺序较原来应该是不变的,所以我们从环中删除\(0\)再判断相对位置即可。还有需要注意的是本题是一个环,找到末尾需要用取模操作回到开头继续比较。示例代码#include<bits/stdc++.h>usingnamespacest......
  • [题解]P4381 [IOI2008] Island
    P4381[IOI2008]Island题意:给定一个基环树森林,求每个基环树的直径之和。我们发现,一棵基环树的直径只有下面两种情况:环上的某一点作为根的子树的直径。环上有两点,每个点引出一条链,然后再将这两点相连。对于第一种情况,我们仅需用树形dp的方法求出每个子树的直径(见OIWiki-......
  • CF1824B1 LuoTianyi and the Floating Islands (Easy Version) 题解
    分析按照\(k\)的奇偶分开考虑。\(k\)为奇数。一个好的节点有且仅有一个在任意两个有人的节点\(i,j\)的路径的交点上的最优位置。若该交点偏移\(1\)步,则必然会使路径长度和\(+1\)。故期望为\(1\)。\(k\)为偶数。任意一个好的节点仍然在任意两个有人的节点\(i,j\)的......
  • 题解 [ABC338D] Island Tour
    【洛谷博客】被降智的一道简单题。题意\(n\)个岛屿,第\(i\)座桥连接\(i\)和\(i+1\)(第\(N\)座桥连接着\(1\)和\(N\))。有一条长度为\(M\)的旅游序列\(X\),你需要按照顺序依次经过这些点,选择断掉一座桥使得旅游经过的桥最少。分析设断掉第\(i\)座桥会因为绕行增......
  • ABC338 D Island Tour 题解
    Question有\(n\)座海岛由\(n\)条桥连着,第\(i\)座桥连接第\(i\)和\(i+1\)座海岛,第\(n\)座桥连接第\(n\)和\(1\)座海盗有一条长度为\(m\)的旅游路线,第\(X_i\)表示依次到达的岛屿现在需要切断一条桥,求总旅游路线最小值Solution显然,从第\(X_{i-1}\)到\(X_......
  • CF1824B1 LuoTianyi and the Floating Islands (Easy Version) 题解
    题意:思路:由于$k∈[1,3]$,分类讨论:当$k=1$时,有人结点自身即为好结点,每种情况的期望为$\frac{1}{n}$,$n$种情况的期望和为$1$。最终答案即为$1$。当$k=2$时,$2$个有人结点之间的路径上的结点即为好结点,那么问题转化为:树上所有路径的结点......
  • poj 2288 Islands and Bridges
    IslandsandBridgesTimeLimit:4000MS MemoryLimit:65536KTotalSubmissions:15357 Accepted:4098DescriptionGivenamapofislandsandbridgesthatconnecttheseislands,aHamiltonpath,asweallknow,isapathalongthebridgessuch......