2021 icpc南京 H. Crystalfly

题目大意:

Paimon 正在树上捕捉水晶蝴蝶,这是提瓦特的一种特殊蝴蝶。树是由 n 个顶点和 (n-1) 个无向边组成的连通图。

在第 i 个顶点上最初有 ai 个晶体。当派蒙到达一个顶点时,她可以立即捕捉到该顶点上所有剩余的水晶蝇。然而,水晶蝇很胆小。当 Paimon 到达一个顶点时,所有相邻顶点上的晶体都会受到干扰。对于第i个顶点,如果顶点上的晶体在第t'秒开始时第一次受到干扰,它们将在第(t'+ti)秒结束时消失。

在第 0 秒开始时,Paimon 到达顶点 1 并在第 1 秒开始之前停留在那里。然后在接下来的每一秒开始时,她可以选择以下两种操作之一:

移动到她当前顶点的相邻顶点之一,并在下一秒开始之前停留在那里(如果目的地中的水晶蝇在那一秒结束时消失,她仍然可以捕捉到它们)。
在下一秒开始之前保持静止在她当前的顶点。
计算 Paimon 在 1010101010 秒内可以捕获的最大晶蝇数量。

输入
有多个测试用例。输入的第一行包含一个整数 T,表示测试用例的数量。对于每个测试用例:

第一行包含一个整数 n (1≤n≤105),表示顶点的数量。

第二行包含 n 个整数 a1,a2,⋯,an (1≤ai≤109),其中 ai 是第 i 个顶点上的晶体数量。

第三行包含 n 个整数 t1,t2,⋯,tn (1≤ti≤3) 其中 ti 是第 i 个顶点上的晶体在受到干扰后消失的时间。

对于接下来的 (n-1) 行,第 i 行包含两个整数 ui 和 vi (1≤ui,vi≤n),表示连接树中顶点 ui 和 vi 的边。

保证所有测试用例的n之和不超过106。

输出
对于每个测试用例,输出一行,其中包含一个整数,表示 Paimon 可以捕获的最大晶蝇数量。(来自谷歌翻译)

解法:

其实这么大的时间我们肯定是可以全部取完的,因此不用考虑时间了,所以我们应该考虑一下该如何捕捉到最多的晶蝶。而这题一看就知道肯定是要用树形dp来做,因此我们可以先开始考虑状态,,我们设立f【x】为x的子节点的所有能获得的最大晶蝶,那么我们状态转移就可以是,

f【x】=所有的子节点的f【x】+当前地方能选定的子节点的晶蝶数减去可能会损失的晶蝶数

而当前状态能怎么选定子节点呢,有两种选法,一种是遇到了一个时间为3的点,我们可以晚点去,然后先去别的点去查找有没有别的点能收,但是这样做的代价就是那个别的点的可能选中的子节点无了,这也是可能会损失的晶蝶数。第二种是一条道走到黑,不转道,这样的话就是我们只走一个点,也就不用考虑可能的子节点的子节点的损失了。

代码如下:

#include<bits/stdc++.h>
#include<vector>
typedef long long ll;
using namespace std;
typedef pair<int,int> PII;
vector<int> v[100005];
long long int a[100005];
long long int ti[100005];
long long f[100005];
bool book[100005];
long long sum[200005];
long long dfs(int x,int fa){
	if(book[x]==1)//记搜,应该不用解释吧。。。
		return f[x];
	book[x]=1;
	for(int i=0;i<v[x].size();i++){
		int y=v[x][i];
		if(y==fa)
			continue;
		f[x]+=dfs(y,x);//先把底下那一层加了 
	}
	long long int t=0;
	int w=0;
	long long int ma=0;
	for(int i=0;i<v[x].size();i++){
		int y=v[x][i];
		if(y==fa)
			continue;
		if(ti[y]==3){
			if(t<a[y])
			t=a[y],w=y;
		}
    }
    ma=t;//先找3的点,然后我们找到了那个点我们就可以开始考虑有没有可能会走第一种,就是别的点走完跑到这里,之所以ma=t的原因是因为怕只走3的点更好
	for(int i=0;i<v[x].size();i++){
		int y=v[x][i];
		if(y==fa)
			continue;
		if(w==y)//如果这个点是我们找到的点就算了,不重复选点
			continue;		
			ma=max(ma,max(a[y],a[y]-sum[y]+t));//是本身好还是其他点好,还有是单个点不转移好还是转移好
			if(ti[y]==3&&w!=0)//如果这个点也是3,我们可能由之前那个最大的点走到这个点来
			ma=max(ma,max(a[y],a[y]-sum[w]+t));
	}
	f[x]+=ma;//加上最大的选点
	sum[x]=ma;//求出最大的选点
	return f[x];
}
int main(){
	int t;
	scanf("%d",&t);
	while(t--){//普通的输入输出
		int n;
		scanf("%d",&n);
		for(int i=1;i<=n;i++)
			scanf("%lld",&a[i]);
		for(int i=1;i<=n;i++)
			scanf("%lld",&ti[i]);
		for(int i=1;i<=n-1;i++){
			int x,y;
			scanf("%d%d",&x,&y);
			v[x].push_back(y);
			v[y].push_back(x);
		}
		long long ans=dfs(1,0)+a[1];
		printf("%lld\n",ans);
		for(int i=0;i<=n;i++)
			v[i].clear();
	    for(int i=0;i<=n;i++){
	        sum[i]=0;
	        book[i]=0;
	        f[i]=0;
	    }//初始化,不用解释吧
	}
}

记得在cf开c++14,不然会在第五个点t,我也不知道为啥。。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 2021年江西省大学生程序设计竞赛是一项针对大学生的编程竞赛活动。该竞赛旨在提高大学生的编程能力和创新思维,促进计算机科学技术的发展和应用。竞赛内容包括算法设计、程序实现、数据结构等方面,参赛选手需要在规定时间内完成指定的编程任务。这是一项非常有挑战性和有意义的竞赛,对于提高大学生的编程水平和实践能力有很大的帮助。 ### 回答2: 2021年3月14日,江西省大学生程序设计竞赛(ICPC)在江西师范大学举行。本次比赛由江西省计算机学会主办,吉林大学博爱学院赞助,共有15支队伍参赛,此次比赛的主要目的是提高学生们的程序设计与算法能力,同时为江西省选出优秀的程序设计人才。 比赛采用ACM国际竞赛的形式,共有12个题目,考察了参赛选手在算法设计、程序实现、数据结构、编程能力等方面的综合素质。比赛时间长达5个小时,选手需要在规定时间内完成尽可能多的题目,并在保证正确性的同时尽量节省时间。 2019年江苏省大学生程序设计竞赛的比赛题分别从算法设计基础、计算几何、动态规划、搜索、数据结构等方面出题,难度适中。所有参赛队伍均在赛场上充分展示了自己的才华和程序设计能力,赛场上紧张的气氛、激烈的角逐使得比赛更加刺激和有趣。 此次比赛从选拔、组织、管理等方面是非常成功的,既展示了江西省大学生程序设计的风采,也为江西省和国家培养了更多的优秀程序设计人才。希望在未来的竞赛中,江西省程序设计的水平能够更上一层楼,培养更多的优秀程序设计人才。 ### 回答3: 2021年江西省大学生程序设计竞赛于2021年11月7日在南昌大学体育馆举行,来自江西省内的30多所高校的近500支队伍参赛。本次比赛分为省赛和校内赛两个阶段,对参赛队伍进行初步筛选和终极评选。 比赛分为解决8道问题的组成员和4道问题的单人组成员两部分,涵盖了计算几何、动态规划、图论、计算几何等多个领域,难度较高。比赛中,每个队伍有5个小时的时间解决问题,只能在计算机上编写代码解决问题,考验了参赛者的编程实力和团队协作能力。 比赛期间,裁判们在场内设立了各种问题的试题,比如“手工奶酪”、“最大独立集”、“调色板”等,每个问题都要求参赛者在规定时间内精确解决。裁判们在以上操作的基础上,继续引入了随机性、收缩性和对称性等要素,使比赛题目更具挑战性。 本次比赛的成功举办,标志着江西省程序设计竞赛赛事的正式起航,并为江西省内高校的程序设计爱好者提供了一个互相交流、共同提高的平台。同时,也为将来江西省大学生程序设计竞赛的举办打下了坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值