首页 > 其他分享 >题解 CF486D Valid Sets

题解 CF486D Valid Sets

时间:2023-10-12 17:13:37浏览次数:32  
标签:continue 子图 int 题解 LL nd Valid Sets dp

题目链接

相当牛逼。

这种找数量的题型,确定树形 \(dp\) 没跑了。

首先思考常规树形 \(dp\),不难想到设 \(f_{u,a,b}\) 表示以 \(u\) 为根节点的子树内(包括点 \(u\)),最大值是 \(a\),最小值是 \(b\) 的连通子图数量,转移很容易,但是这样时间空间复杂度是 \(\rm O(n^3)\),而且无论是状态上还是转移上都没有优化的空间。

这时考虑树形 \(dp\) 的另一种形式:特殊意义法。

我们从思考每个点对答案做出的贡献,从一个点出发,并规定这个点是联通子图中的最大值,为了不重复,规定若 \(a_x=a_y\),当 \(x>y\) 时点 \(x\) 更大。

那么我们从每个点出发,设 \(f_u\) 表示以 \(u\) 为根节点的连通子图个数,转移是显然的:

\[f_{u}=f_{u}+f_{u}\times f_{son} \]

代码:

#include<bits/stdc++.h>
using namespace std;

typedef long long LL;
LL read() {
    LL sum=0,flag=1; char c=getchar();
    while(c<'0'||c>'9') {if(c=='-') flag=-1; c=getchar();}
    while(c>='0'&&c<='9') {sum=sum*10+c-'0'; c=getchar();}
    return sum*flag;
}

const int N=2100;
const LL MOD=1e9+7;
int n,d;
int a[N];
LL f[N];
vector<int> g[N];

void dfs(int nd,int fa,int id,int w) {
	f[nd]=1;
	for(int x:g[nd]) {
		if(x==fa) continue;
		if(a[x]>w||(a[x]==w&&x>id)) continue;
		if(w-a[x]>d) continue;
		dfs(x,nd,id,w);
		f[nd]=(f[nd]+f[nd]*f[x]%MOD)%MOD;
	}
}

int main() {
	cin>>d>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<n;i++) {
		int x,y; cin>>x>>y;
		g[x].push_back(y);
		g[y].push_back(x);
	}
	LL ans=0;
	for(int i=1;i<=n;i++) {
		memset(f,0,sizeof(f));
		dfs(i,0,i,a[i]);
		ans=(ans+f[i])%MOD;
	}
	cout<<ans;

    return 0;
}
/*
*/

标签:continue,子图,int,题解,LL,nd,Valid,Sets,dp
From: https://www.cnblogs.com/zhangyuzhe/p/17759939.html

相关文章

  • Debian12安装elasticsearch实践及问题解决方案
    一、安装安装其实很简单,直接上官网链接:下载地址,官网提供了所有安装方式,总一款适合你。我的目标系统是Debian12,包管理是apt-get,所以就以这个为示例,仅供参考。1、先选择需要安装的版本2、导入ElasticsearchPGP密钥wget-qO-https://artifacts.elastic.co/GPG-KEY-elastic......
  • 原创题题解
    实时更新。众所周知的,原创题就是即原神又创人的题。当然有的题不会放,等考了在放。波特问题描述流水线上有\(n\)个波特,每个波特有一个工作效能\(a_i\)。对于每一个波特,当它遇到一个工件时,它会对其进行加工,耗费\(1\)个单位时间,然后把它传递给它前面中工作效能最大的波特,......
  • #9134. 翻转硬币 题解
    首先考虑一些简单的情况,比如\(m=1\)。容易发现操作1和操作2的顺序不会影响结果,于是可以钦定所有操作1在操作2之前。并且可以发现,进行完所有1后2的次数即为\((\text{连续段个数}-1)\)。然后考虑将\(m>1\)的情况。显然最后序列上每\(m\)长度分一段,则每一段都相......
  • 报错解决:java.security.InvalidKeyException: Illegal key size(微信支付v3遇到的问
    前言在使用微信支付v3生成jar包后本地测试没有问题在开发小程序支付功能的时候:本地开发好好的,放在linux服务器上运行时碰到报错原因是因为微信支付256位秘钥加密解密策略 可能会导致某些jdk的版本加密解密出现问题解决首先观察你这个目录下的文件根据文件内容做判断看下......
  • [CF1098E] Fedya the Potter 题解
    [CF1098E]FedyathePotter题解前言一道类欧好题。题解这道题让求\(c\)数组的中位数,那么有一个比较套路的方法就是二分答案\(mid\)然后计算\(b\)数组中区间和小于\(mid\)的区间个数进行\(check\)。但是\(b\)数组总共有\(\mathcal{O}(n^2)\)项,考虑如何优化。因......
  • [ABC245G] Foreign Friends 题解
    [ABC245G]ForeignFriends题解想法考虑所有颜色相同的弱化版。这种情况下,只需要把所有特殊点都推入队列之后跑多源Dijkstra即可。思路正解与上述做法大致相同。如果有颜色限制,那么可以考虑这个神仙思路:把所有特殊点的颜色用二进制表示,对于每一位,这一位是\(0\)的特殊......
  • CF882E1+CF1882E2 Two Permutations 题解-构造题
    CF882E1+CF1882E2TwoPermutations题解-构造题哇,人类智慧,太智慧了。。。此题作为20231010联考的T3。感觉赛时根本没有去往这方面想。CF1882E1CF1882E2E1是简单版,就是没有要求操作数最小化。E1-EasyVersion方法1首先考虑没有次数限制的,对于单独的每一个串的情况。......
  • (关于创建时用com/example和com.example导致的mapper包对应不上)org.apache.ibatis.bi
    日志输出:Servlet.service()forservlet[dispatcherServlet]incontextwithpath[]threwexception[Requestprocessingfailed;nestedexceptionisorg.apache.ibatis.binding.BindingException:Invalidboundstatement(notfound):com.example.mapper.EmpMapper.li......
  • [USACO17JAN] Promotion Counting P 题解
    [USACO17JAN]PromotionCountingP题解前言好久没写题解了,今天趁我心情好赶紧水一篇。思路首先拿到这题,关键词检索:子树,比\(p_i\)大的,树状数组!现在考虑如何去掉其他子树的贡献……emm,我直接在算贡献的时候去掉其他子树的贡献不就好了!当然,暴力去贡献复杂度肯定爆炸,这里考虑......
  • [USACO08FEB]meteor Shower S题解(bfs)
    题目描述贝茜听说一场特别的流星雨即将到来:这些流星会撞向地球,并摧毁它们所撞击的任何东西。她为自己的安全感到焦虑,发誓要找到一个安全的地方(一个永远不会被流星摧毁的地方)。如果将牧场放入一个直角坐标系中,贝茜现在的位置是原点,并且,贝茜不能踏上一块被流星砸过的土地。根据预......