首页 > 其他分享 >SP666 VOCV - Con-Junctions 题解

SP666 VOCV - Con-Junctions 题解

时间:2024-08-25 17:04:53浏览次数:13  
标签:SP666 int 题解 else writeln Junctions dp mod

注意到这个问题具有最优子结构性,考虑树上dp。记 $dp[i][0/1]$ 表示 i 号节点不放灯或放灯的最小值,$s[i][0/1]$ 为对应的方案数。

那么我们可以进行如下转移: $dp[u][0] = \sum_{u->v} dp[v][1]$ $dp[u][1] = \sum_{u->v} \min(dp[v][0], dp[v][1])$

在更新对应的dp数组时,我们用乘法原理同步更新s数组即可。

const int N = 100015, mod = 10007;
int T, n; vector <int> G[N];

int dp[N][2], s[N][2];
inline void dfs(int u, int f) {
	dp[u][1] = 1;
	for (auto v : G[u]) {
		if (v == f) continue;
		dfs(v, u);
		if (dp[v][1] > dp[v][0]) dp[u][1] += dp[v][0], s[u][1] = s[u][1] * s[v][0] % mod;
		else if (dp[v][1] < dp[v][0]) dp[u][1] += dp[v][1], s[u][1] = s[u][1] * s[v][1] % mod;
		else dp[u][1] += dp[v][0], s[u][1] = s[u][1] * (s[v][0] + s[v][1]) % mod;
		dp[u][0] += dp[v][1]; s[u][0] = s[u][0] * s[v][1] % mod;
	}
}

signed main(void) {
	for (read(T); T; T--) {
		read(n);
		for (int i = 1; i <= n; i++) G[i].clear(), dp[i][0] = dp[i][1] = 0, s[i][0] = s[i][1] = 1;
		for (int i = 1, u, v; i < n; i++) read(u), read(v), G[u].push_back(v), G[v].push_back(u);
		dfs(1, 0);
		if (dp[1][1] > dp[1][0]) writeln(dp[1][0], ' '), writeln(s[1][0]);
		else if (dp[1][1] < dp[1][0]) writeln(dp[1][1], ' '), writeln(s[1][1]);
		else writeln(dp[1][0], ' '), writeln((s[1][0] + s[1][1]) % mod);
	}
    return 0;
}

标签:SP666,int,题解,else,writeln,Junctions,dp,mod
From: https://www.cnblogs.com/EternalEpic/p/18379141

相关文章

  • P9482 [NOI2023] 字符串 题解
    题目描述\(T\)组数据,给定长为\(n\)的字符串\(s\),\(q\)次询问,给定\(i,r\),求有多少个\(l\)满足:\(1\lel\ler\)。\(s[i:i+l-1]\)字典序小于\(R(s[i+l:i+2l-1])\)。数据范围\(1\leT\le5,1\len,q\le10^5,1\lei+2r-1\len\)。时间限制\(\texttt{1s}\),......
  • Triple Attack 题解
    直接暴力显然不可行。我们容易发现,变量\(T\)的增量以\(3\)为循环,一次循环会造成\(5\)的贡献,所以我们容易想到对每个\(a_i\)直接对\(5\)计算倍数和取余,然后对于余数分类讨论去增加,然后对于倍数部分统一增加即可。有些细节。Code#include<bits/stdc++.h>//#include......
  • Minimum Steiner Tree 题解
    原题,详见P10723。几乎相同,我们只需要以一个需要选择的点为根,遍历子树看看有没有出现需要选择的点,然后直接去删除即可,可以看我的博客。但是我们也可以换一种做法,用类似拓扑排序的算法。先找到所有只连一条边且没有被选择的点,然后放进队列,接着依次取出队头遍历与它相连的点,同时记......
  • k8s中coredns访问连接拒绝问题解决
    问题现象1、节点访问coredns连接拒绝2、内部pod无法正常进行解析问题解决思路检查CoreDNSPod状态是否正常[root@k8s-master01~]#kubectlgetpods-nkube-system-lk8s-app=kube-dnsNAMEREADYSTATUSRESTARTSAGEcoredns-7b8d6fc5......
  • CSP-J 2023 初赛试题解析(第三部分:完善程序(1-2))
    第一题补全后完整代码:#include<iostream>#include<vector>usingnamespacestd;intfind_missing(vector<int>&nums){intleft=0,right=nums.size()-1;while(left<right){intmid=left+(right-left)/2;if(nums[mi......
  • 洛谷SCP 2024 第一轮(初赛 J 组)模拟题解析(第三部分:完善程序(1-2))
    完善程序一(补全)#include<bits/stdc++.h>usingnamespacestd;constintMAXN=100000;intn;intvis[MAXN],a[MAXN];vector<int>ans;intcheck(intk){intx=n,top=0;for(inti=0;i<=k;i++)vis[i]=0;while(x......
  • 题解:P10358 [PA2024] Obrazy
    题解:P10358[PA2024]Obrazy题目传送门即当最小的画框都不可能覆盖整个矩形墙面时,输出−1。[PA2024]Obrazy题目背景PA20243C题目描述题目译自PA2024Runda3Obrazy,感谢Macaronlin提供翻译给定尺寸为$h\timesw$的矩形墙面,以及$n$种尺寸的正方形画框,每种尺寸......
  • SP10502 VIDEO - Video game combos 题解
    题目传送门前置知识AC自动机解法多模式串匹配考虑AC自动机。令\(f_{i,j}\)表示前\(i\)个字符,当前运行到AC自动机的状态\(j\)时的最大得分。状态转移方程为\(f_{i,k}=\max\limits_{k\inSon(j)}\{f_{i-1,j}+sum_{k}\}\),其中\(sum_{k}\)表示fail树上以\(k......
  • 历年CSP-J初赛真题解析 | 2015年CSP-J初赛阅读程序(23-26)
    学习C++从娃娃抓起!记录下CSP-J备考学习过程中的题目,记录每一个瞬间。附上汇总贴:历年CSP-J初赛真题解析|汇总_热爱编程的通信人的博客-CSDN博客#include<iostream>usingnamespacestd;intmain(){inta,b,c;a=1;b=2;c=3;if(a>b){......
  • abc368 题解
    切了ABCDF,G赛后1min切了(恼比赛链接:https://atcoder.jp/contests/abc368A-Cut题意:给定一个长度为\(n\)的序列,先输出后\(k\)个数,在输出前\(n-k\)个数。思路:按题意模拟即可。代码:https://atcoder.jp/contests/abc368/submissions/57030066B-Decrease2maxel......