首页 > 其他分享 >[做题记录]做题记录 3

[做题记录]做题记录 3

时间:2024-11-28 21:11:16浏览次数:7  
标签:sz f2 min int auto 记录 mod

Jinan 2023 B

朴素 dp:\(f_{i, j}\) 代表 \(i\) 为根的子树划分完,\(i\) 所在连通块大小为 \(j\)。转移平凡 \(O(nk)\)。

考虑 \(k\) 很大时复杂度退化成 \(n ^ 2\)。发现 \(k\) 很大时连通块个数很小,只有 \(O(\dfrac{n}{k})\) 级别。因此不妨设 \(f_{i, a, b}\) 表示 \(i\) 为根,子树中有 \(a\) 个大小为 \(k\) 的,\(b\) 个大小为 \(k + 1\) 的,\(sz_i - ak - b(k + 1)\) 个节点在 \(i\) 所在连通块。发现状态总数实际上是 \(O(n \times \dfrac{n}{k})\) 的。

对 \(k\) 进行阈值分治,不难发现当 \(k = \sqrt n\) 是取得最有复杂度,即为 \(O(n ^ {1.5})\)。

using namespace std;

const int N = 100010; 
const int mod = 998244353;
vector<int> E[N];
int f[N][1010], T, n, k, sz[N];
unordered_map<int, int> f2[N];
void dfs(int u, int fa) {
	sz[u] = 1; f[u][1] = 1;
	for (auto v : E[u]) if (v ^ fa) {
		dfs(v, u); vector<int> g(min(sz[u] + sz[v], k + 1) + 1);
		rep(i, 0, min(sz[u], k + 1))
			rep(j, 0, min(sz[v], k + 1 - i))
				g[i + j] = (g[i + j] + f[u][i] * f[v][j]) % mod;
		rep(i, 0, min(sz[u] + sz[v], k + 1)) f[u][i] = g[i];
		g.clear(); g.shrink_to_fit(); sz[u] += sz[v]; 
	} f[u][0] = (f[u][0] + f[u][k]) % mod;
	f[u][0] = (f[u][0] + f[u][k + 1]) % mod;
}
void dfs2(int u, int fa) {
	f2[u][1] = 1;
	for (auto v : E[u]) if (v ^ fa) {
		dfs2(v, u); unordered_map<int, int> g;
		for (auto [x1, y1] : f2[u]) for (auto [x2, y2] : f2[v]) if (x1 + x2 <= k + 1)
			(g[x1 + x2] += y1 * y2 % mod) %= mod; f2[u] = g;
	} if (f2[u].find(k) != f2[u].end()) (f2[u][0] += f2[u][k]) %= mod;
	if (f2[u].find(k + 1) != f2[u].end()) (f2[u][0] += f2[u][k + 1]) %= mod;
}
signed main() {
	scanf("%lld", &T);
	while (T -- ) {
		scanf("%lld%lld", &n, &k);
		rep(i, 1, n) E[i].clear();
		rop(i, 1, n) {
			int a, b; scanf("%lld%lld", &a, &b);
			E[a].push_back(b), E[b].push_back(a);
		} if (k <= (int)sqrt(n) * 3) {
			rep(i, 1, n) rep(j, 0, k + 1) f[i][j] = 0;
			dfs(1, 0); printf("%lld\n", f[1][0]);
		} else {
			rep(i, 1, n) f2[i].clear();
			dfs2(1, 0); printf("%lld\n", f2[1][0]);
		}
	} return 0;
} 

ECFinal 2023 C

第一眼看到这道题的想法:\(f_{i, j}\) 表示 \(x\) 的前 \(i\) 个位置和为 \(j\) 的方案,以及 \(g_{i, j}\) 表示 \(y\) 的前 \(i\) 个位置和为 \(j\) 的方案。这部分可以 \(O(n ^ 2 w)\)。

枚举 \(p, q\)。需要求出 \(\sum \limits_{i \le \min(s_p, s_q)} f_{p, i} \times f_{q, i}\)。这是一个向量点积的形式。发现这个东西是 \(O(n ^ 3 w)\) 的。使用多项式科技可以 \(O(n ^ 2w\log)\)。

考虑更加高级的做法。不妨设 \(f_{i, j, k}\) 表示 \(x\) 中做完了前 \(i\) 个,\(y\) 中做完了前 \(j\) 个,\(s_b - s_a = k\) 的方案数。

若 \(k > 0\) 则转移到 \(f_{i + 1, j}\),否则转移到 \(f_{i, j + 1}\)。由于第三维大小是介于 \(-w\) 到 \(w\) 之间的,因此复杂度 \(O(n ^ 2 w)\)。

Nanjing 2023 D

一个简单的思路是:设 \(f_{i, j}\) 表示以 \(i\) 为根,叶子节点到根节点路径上黑色节点个数均为 \(j\) 所需要修改的最少点数。这样可以做到 \(O(nm)\)。转移方程是:

\[f_{u, i} \leftarrow \min\{c_{u, 0} + \sum f_{v, i - 1}, c_{u, 1} + \sum f_{v, i}\} \]

这个东西可以长链剖分,然后对于轻链的合并做 \((\min, +)\) 卷积即可。可以做到线性。

标签:sz,f2,min,int,auto,记录,mod
From: https://www.cnblogs.com/Link-Cut-Y/p/18575187

相关文章

  • [比赛记录]ARC174
    Finalranking:\(820\)。A平凡题。不妨设选定操作的区间为\([l,r]\),这一段的和为\(s\)。如果\(c>0\),则相对于原来的数组来说,操作后的和增加了\((c-1)\timess\)。我们期望选择最大的\(s\)来获得最大的增量。很显然我们需要求最大子段和。如果\(c<0\),则相对于......
  • 做题记录 2
    上一个写的太多了,卡爆了。所以再开一个。P4321随机漫游一道综合多种算法的好题。首先按照图上随机游走的套路,再依据\(n\)很小的限制,可以设出\(dp\)方程:设\(f_{s,u}\)表示当前走过的点集为二进制数\(s\),当前在\(u\)点,再走完所有点的期望步数。那么显然有\(f_{(1<<......
  • 2024.11.[~, 28]训练记录
    好,今天是noip2024前最后一次模拟。但是我参加不了noip。还是认真参加了模拟赛。自主复习就写训练记录吧。落下很多天了。今天的题疑似有点难订正了。那就先写今天的。11.28noip模拟今天的考试时间为了全真对标特意推迟了半个小时,写到最后还是有点困了。毕竟平常一点钟睡午......
  • 大数据学习记录,Python基础(2)
    数据类型字符串概述:由若干个字符组成字符序列,称之为字符串特点:字符串一旦被创建就不能被更改定义一个字符串s1="hello"字符串一旦被创建就不能被更改s1="hello"s1="world"#相当于将新的字符串内存中的地址值赋值给了s1,原本的"hello"的内容没有改变print(......
  • 2024.11.20训练记录
    pack设当前手上的钱数为x。二分一段一段跳的复杂度是对的。因为,如果下一段的代价总和sum<\dfrac{x}{2}。那么这一段的下一个数肯定也小于\dfrac{x}{2}。因为是从大到小排。所以还能继续选下一个数,引出矛盾。所以每段的代价总和只能大于\dfrac{x}{2}。那段数就是log级别的。......
  • 11.28 CW 模拟赛 赛时记录
    看题有外校的一起考,那我爆个\(0\)\(\rm{A}\)至少不能是简单题考虑找规律一类的东西,看能不能推出来?\(\rm{B}\)啊?也是需要脑子,多半不会做,应该也是规律题\(\rm{C}\)至少暴力可以打,争取达到高档暴力\(\rm{D}\)能打到这在想吧完了嘛时间分配:\(1\rm{h}+......
  • Synopsys 安装记录
    Synopsys安装记录安装环境概述系统:win11的wslubuntu18.04软件:芯王国提供的Synopsys2018完整的安装教程请参考:搭建属于自己的数字ICEDA环境(三):Centos7安装EDA(vcs2018、verdi2018等)IC工具以及脚本运行第一个工程_sclkeygen-CSDN博客解压遇到的问题压缩包分卷压缩的,在lin......
  • 这些不同类型的 DNS 记录承担着不同的职责,确保域名能够正确地解析到对应的服务、设备
    DNS(域名系统,DomainNameSystem)是用于将域名(如www.example.com)解析为IP地址的系统,它通过一系列的DNS记录来实现这一过程。不同类型的DNS记录对应不同的功能,下面是常见的几种DNS记录类型:1. A记录(AddressRecord)功能:将域名解析为IPv4地址。示例:CopyCodeexample......
  • 如何记录网站来访者的IP地址
    js如何记录来访者ipEdit2•2024年9月23日下午12:49•百科 JS如何记录来访者IP:使用服务器端语言、调用第三方API服务、结合前端和后端技术  在JavaScript中,直接获取来访者的IP地址并不容易,因为JavaScript运行在客户端环境中,而IP地址信息通常在服务器端获取。为......
  • 记录Vue Antd 表格RowSelection刷新列表后缓存问题
    起因 原来的代码//tsx部分<BaseTableoptions={tableData.options}columns={tableData.columns}data={tableData.data}/>constselectKeys=ref<string[]>([])//表格配置consthandleRowSelection={......