首页 > 其他分享 >树形dp专项测试1

树形dp专项测试1

时间:2024-12-15 23:32:04浏览次数:2  
标签:专项 ch int cnt fa 树形 il dp define

A. Promises I Can't Keep
题目意为求以每个点为根时的期望得分的最大值,换根DP即可。
式子不太难推,半个小时就出来了。太长了不往这写了。

Code

#include<bits/stdc++.h>
#define ll long long
#define il inline
#define read(x){\
	char ch;\
	int fu=1;\
	while(!isdigit(ch=getchar()))\
		fu-=(ch=='-')<<1;\
	x=ch&15;\
	while(isdigit(ch=getchar()))\
		x=(x<<1)+(x<<3)+(ch&15);\
	x*=fu;\
}
#define pb push_back
using namespace std;
namespace asbt{
namespace cplx{bool begin;}
const int maxn=5e5+5;
int n,cnt[maxn];
double a[maxn],f[maxn];
vector<int> e[maxn];
il void dfs1(int u,int fa){
	f[u]=a[u];
	for(int v:e[u]){
		if(v==fa){
			continue;
		}
		dfs1(v,u);
		cnt[u]++;
	}
	for(int v:e[u]){
		if(v==fa){
			continue;
		}
		f[u]+=f[v]/cnt[u];
	}
}
il void dfs2(int u,int fa){
	for(int v:e[u]){
		if(v==fa){
			continue;
		}
		double tmp=cnt[u]==1?a[u]:(((f[u]-a[u])*cnt[u]-f[v])/(cnt[u]-1)+a[u]);
		f[v]=a[v]+((f[v]-a[v])*cnt[v]+tmp)/(cnt[v]+1);
		cnt[v]++;
		dfs2(v,u);
	}
}
namespace cplx{
	bool end;
	il double usdmem(){return (&begin-&end)/1048576.0;}
}
int main(){
	read(n);
	for(int i=1,u,v;i<n;i++){
		read(u)read(v);
		e[u].pb(v),e[v].pb(u);
	}
	for(int i=1;i<=n;i++){
		scanf("%lf",a+i);
	}
	dfs1(1,0),dfs2(1,0);
	double ans=0;
	for(int i=1;i<=n;i++){
		ans=max(ans,f[i]);
	}
//	for(int i=1;i<=n;i++){
//		cout<<f[i]<<" ";
//	}
//	puts("");
	printf("%.4f",ans);
	return 0;
}
}
int main(){return asbt::main();}
/*
4
1 2
2 3
2 4
1 2 3 4
*/

刚这个是考场代码,直接0分。
原因是:

接下来电流会等概率且不重复经过一个点地流向一个叶子节点

一个叶子节点,不是一个子节点。。。
正解在这里

Code

#include<bits/stdc++.h>
#define ll long long
#define il inline
#define read(x){\
	char ch;\
	int fu=1;\
	while(!isdigit(ch=getchar()))\
		fu-=(ch=='-')<<1;\
	x=ch&15;\
	while(isdigit(ch=getchar()))\
		x=(x<<1)+(x<<3)+(ch&15);\
	x*=fu;\
}
#define pb push_back
using namespace std;
namespace asbt{
namespace cplx{bool begin;}
const int maxn=5e5+5;
int n,a[maxn],cnt[maxn],tot;
long double f[maxn];
vector<int> e[maxn];
il void dfs1(int u,int fa){
	f[u]=a[u];
	if(fa&&e[u].size()==1){
		cnt[u]=1;
	}
	for(int v:e[u]){
		if(v==fa){
			continue;
		}
		dfs1(v,u);
		cnt[u]+=cnt[v];
	}
	for(int v:e[u]){
		if(v==fa){
			continue;
		}
		f[u]+=f[v]*cnt[v]/cnt[u];
	}
}
il void dfs2(int u,int fa){
	for(int v:e[u]){
		if(v==fa){
			continue;
		}
		double tmp=(((f[u]-a[u])*cnt[u]-f[v]*cnt[v]))/(tot-cnt[v])+a[u];
		tmp=(f[v]-a[v])*cnt[v]+tmp*(tot-cnt[v]);
		cnt[v]=tot;
		if(e[v].size()==1){
			cnt[v]--;
		}
		f[v]=tmp/cnt[v]+a[v];
		dfs2(v,u);
	}
}
namespace cplx{
	bool end;
	il double usdmem(){return (&begin-&end)/1048576.0;}
}
int main(){
	read(n);
	for(int i=1,u,v;i<n;i++){
		read(u)read(v);
		e[u].pb(v),e[v].pb(u);
	}
	for(int i=1;i<=n;i++){
		read(a[i]);
		if(e[i].size()==1){
			tot++;
		}
	}
	dfs1(1,0);
//	for(int i=1;i<=n;i++){
//		cout<<cnt[i]<<" ";
//	}
//	puts("");
	dfs2(1,0);
//	for(int i=1;i<=n;i++){
//		cout<<f[i]<<" ";
//	}
//	puts("");
	long double ans=-1e18;
	for(int i=1;i<=n;i++){
		ans=max(ans,f[i]);
	}
	printf("%.4Lf",ans);
	return 0;
}
}
int main(){return asbt::main();}
/*
5
1 2
2 3
3 4
4 5
1 2 3 4 5
*/

B. [COCI2016-2017#4] Rima
考场上想到了倒着建trie,也想到了父亲和儿子只有两种情况,但是忽略了一个很重要的性质,那就是因为没有两个相同的字符串,所以最后形成的字符串序列一定是一个长度先减后增的样子。
所以可以在trie树上搞一个很简单的DP,设 \(dp[u]\) 表示以 \(u\) 为结尾的字符串在一端的最长序列,于是当 \(u\) 是一个结尾,且它的儿子也是一个结尾时,就可以转移。
最终的答案一定是先减后增的情况,式子也不难推。

Code

#include<bits/stdc++.h>
#define ll long long
#define il inline
#define read(x){\
	char ch;\
	int fu=1;\
	while(!isdigit(ch=getchar()))\
		fu-=(ch=='-')<<1;\
	x=ch&15;\
	while(isdigit(ch=getchar()))\
		x=(x<<1)+(x<<3)+(ch&15);\
	x*=fu;\
}
#define pb push_back
#define mp make_pair
#define fir first
#define sec second
using namespace std;
namespace asbt{
namespace cplx{bool begin;}
const int maxn=3e6+5;
int n,tot,dp[maxn],end[maxn];
vector<pair<int,char> > e[maxn];
char s[maxn];
namespace cplx{
	bool end;
	il double usdmem(){return (&begin-&end)/1048576.0;}
}
int main(){
	read(n);
	for(int i=1;i<=n;i++){
		scanf(" %s",s+1);
		int len=strlen(s+1);
		int p=0;
		for(int j=len;j;j--){
			for(auto x:e[p]){
				if(x.sec==s[j]){
					p=x.fir;
					goto togo;
				}
			}
			e[p].pb(mp(++tot,s[j]));
			p=tot;
			togo:;
		}
		end[p]++;
	}
	int ans=0;
	for(int u=tot;~u;u--){
		int mx1=0,mx2=0,cnt=0;
		for(auto x:e[u]){
			int v=x.fir;
			cnt+=end[v];
			if(dp[v]>mx1){
				mx2=mx1;
				mx1=dp[v];
			}
			else{
				mx2=max(mx2,dp[v]);
			}
		}
		if(end[u]){
			dp[u]=mx1+max(cnt,1);
		}
		ans=max(ans,mx1+mx2+max(cnt-2,0)+end[u]);
	}
	printf("%d",ans);
	return 0;
}
}
int main(){return asbt::main();}

C. [CEOI2020] 星际迷航
之前就出过一次这道题,当时改过了,但是那道题数据太水了,所以同一篇代码拿到这里直接获得7pts……
先咕着吧

D. 「SMOI-R1」Company

标签:专项,ch,int,cnt,fa,树形,il,dp,define
From: https://www.cnblogs.com/zhangxyhp/p/18608284

相关文章

  • DDPM, DDIM, LDM 和stable diffusion
    以下是这些模型的发展历程的概述:DDPM(DenoisingDiffusionProbabilisticModels):DDPM是扩散模型的早期形式,它通过逐步去噪的方式生成高质量数据,但其效率较低,特别是在处理高分辨率图像时需要耗费大量的计算资源。DDIM(DenoisingDiffusionImplicitModels):DDIM是DDPM的......
  • DP协议:概括
    来了来了!!!开始之前扯点概念,知道DP好在哪里,以及看到它的发展趋势,才知道我们为什么有学习的必要。DP的优势DisplayPort(DP)协议作为一种专为数字音频和视频传输设计的高速串行接口标准,在现代显示技术和多媒体应用中扮演着至关重要的角色。它由视频电子标准协会(VESA)这一权......
  • DP协议:缩略词
    缩写代表的含义ACT分配更改触发(AllocationChangeTrigger)API应用程序编程接口(ApplicationProgrammingInterface)AUX辅助(Auxiliary)BER比特错误率(BitErrorRate)bpc每色比特数(BitsPerComponent)bpp每像素比特数(BitsPerPixel)BE消隐结束(BlankingEnd)BS消隐开始(BlankingSta......
  • DP协议:术语表
    术语定义ANSI8B/10B通道编码规范,如ANSIX3.230-1994条款11所述AUXCH半双工、双向通道,位于DisplayPort发射器和DisplayPort接收器之间。由1个差分对组成,使用Manchester格式以1Mbps速率或FAUX格式以720Mbps速率传输数据。DisplayPort上游设备是主设备(也称为AUXCH请求者),发起......
  • udp_rcv函数
    udp_rcv是一个Linux内核中的函数,用于处理接收到的UDP数据报。作为内核网络子系统的一部分,它承担了对接收UDP数据包的处理,包括分发到正确的套接字,执行必要的校验等。以下是关于udp_rcv大致的工作流程的描述(具体实现可能会根据内核版本有所不同):工作流程1.**接收数据......
  • 树形DP做题记录
    A.「MXOIRound1」城市首先推个小式子,把让求的答案中和\(n+1\)有关的分出来:\[\begin{align}&\sum_{i=1}^{n+1}\sum_{j=1}^{n+1}cost(i,j)\\=&\sum_{i=1}^{n+1}\sum_{j=1}^{n}cost(i,j)+\sum_{i=1}^{n+1}cost(i,n+1)\\=&\sum_{i=1}^{n}\sum_{j=1}^{n}cost(i,j)+\......
  • Qt | 安全的udp服务器搭建(代码框架值得学习)
    点击上方"蓝字"关注我们01、项目框架>>>02、QHostAddress>>>QHostAddress 是 Qt 网络模块中的一个类,用于表示IP地址。它支持IPv4和IPv6地址,可以用于网络编程中,如建立TCP或UDP连接。QHostAddress 提供了一些方法来处理和转换IP地址03、m......
  • 构造专项(ideas)
    数学构造P5441【XR-2】伤痕有点神秘。反正我不会,有人所是\(CMO\)的原题。首先,一个很显然的事实是找出来的这四个点要强联通。所以总方案数减去不强连通的方案数。通过一些手段,我们可以发现不连通的方案只有三种情况(只考虑图中某四个点)。一个点是三个单向边的起点(有进不去......
  • 使用任务队列TaskQueue和线程池ThreadPool技术实现自定义定时任务框架详解
    前言在桌面软件开发中,定时任务是一个常见的需求,比如定时清理日志、发送提醒邮件或执行数据备份等操作。在C#中有一个非常著名的定时任务处理库Hangfire,不过在我们深入了解Hangfire之前,我们可以手动开发一个定时任务案例,用以帮助我们理解Hangfire的核心原理。我们可以利用......
  • 【网络】传输层协议UDP/TCP&&网络层IP&&数据链路层MAC&&NAT详解
    主页:醋溜马桶圈-CSDN博客专栏:计算机网络原理_醋溜马桶圈的博客-CSDN博客gitee:mnxcc(mnxcc)-Gitee.com目录1.传输层协议UDP1.1传输层1.2端口号1.3UDP协议1.3.1UDP协议端格式1.3.2 UDP的特点1.3.3 面向数据报1.3.4UDP的缓冲区1.3.5UDP使用注意事......