首页 > 其他分享 >NOI2023 D1T2 桂花树

NOI2023 D1T2 桂花树

时间:2023-09-27 13:55:43浏览次数:31  
标签:结点 le int lca NOI2023 桂花树 forall operatorname D1T2

称编号 \(> n\) 的点为新点。

由条件 1 可以推出树 \(T\) 为结点 \(1 \sim n\) 在树 \(T'\) 上的 虚树

由条件 2 可以推出 \(\forall 1 \le u < v \le n + m, \operatorname{lca}(u, v) \le v + k\)。

首先考虑 \(k = 0\) 的做法:

此时 \(\forall 1 \le u < v \le n + m, \operatorname{lca}(u, v) \le v\)。

考虑从小到大加入新点 \(i\),则需要满足 \(\max\limits_{j = 1}^i \{\operatorname{lca}(i, j)\} \le i\),即 \(i\) 只能插在一条边上或挂为叶子结点,故答案为:

\[\prod_{i = n}^{n + m - 1}(2i - 1) \]

把从小到大加入新点的做法延续到 \(k > 0\) 的情况考虑:

此时 \(\forall 1 \le u < v \le n + m, \operatorname{lca}(u, v) \le v + k\),和上面唯一的区别就是会存在 \(i \in [1, n], j \in [n + 1, n + m]\),满足 \(\operatorname{lca}(i, j) \in [j + 1, j + k]\)。

考虑此时出现了哪些加点的新方式,归纳后可以发现在插入 \(i\) 时,可以把 \(j ( i + 1 \le j \le i + k)\) 插在树的某条边上,再将 \(i\) 挂为 \(j\) 的儿子。

总之,加点时有如下三种选择(令每次操作前树的大小为 \(sz\)):

  • 将 \(i\) 插在一条边上或挂为叶子结点,方案数 \(2sz - 1\)。
  • 在某条边上新建一个待定结点并将 \(i\) 挂在其下,方案数 \(sz - 1\)。
  • 用 \(i\) 填上某个待定结点。

\(k \le 10\),又是树上的计数问题,状压 DP 就好。

令 \(f(i, S)\) 表示插入了 \(i\) 个点,前 \(k\) 个加点操作的剩余待定结点状态为 \(S\) 时的方案数,按三种情况转移就好,注意 \(sz = i + \operatorname{popcount(S)}\)。

时间复杂度 \(\mathcal O(t \cdot 2^kkm)\)。

代码:

#include <bits/stdc++.h>

using namespace std;

typedef unsigned long long ull;

constexpr int MAXN = 3e4 + 10, MAXM = 3e3 + 10, MOD = 1e9 + 7;

int n, m, k, fa[MAXN];
ull f[MAXM][1 << 10];

void solve() {
	cin >> n >> m >> k;
	for (int i = 2; i <= n; i++) cin >> fa[i];
	if (k == 0) {
		ull ans = 1;
		for (int i = n; i < n + m; i++) (ans *= ((i << 1) - 1)) %= MOD;
		cout << ans << '\n';
		return;
	}
	memset(f, 0, sizeof(f)), f[0][0] = 1;
	for (int i = 0; i < m; i++) {
		for (int S = 0; S < (1 << k); S++) {
			if (!f[i][S]) continue;
			for (int j = S; j; j -= j & (-j)) {
				int toS = (S ^ (j & (-j))) << 1;
				if (toS < (1 << k)) (f[i + 1][toS] += f[i][S]) %= MOD;
			}
			if ((S << 1) < (1 << k)) {
				int sz = n + i + __builtin_popcount(S);
				(f[i + 1][S << 1] += f[i][S] * ((sz << 1) - 1)) %= MOD;
				(f[i + 1][S << 1 | 1] += f[i][S] * (sz - 1)) %= MOD;
			}
		}
	}
	cout << f[m][0] << '\n';
}

int main() {
	ios_base::sync_with_stdio(0); cin.tie(nullptr), cout.tie(nullptr);
	int c, t; cin >> c >> t;
	while (t--) solve();
	return 0;
}

标签:结点,le,int,lca,NOI2023,桂花树,forall,operatorname,D1T2
From: https://www.cnblogs.com/chy12321/p/17732514.html

相关文章

  • noi2023游记
    前情提要tjD类什么垃圾不用我说了吧。Day-1到场了,挺热的。和两位同校巨佬分到了一个宿舍还有一位E类都比我强/kel中午和三位同校巨佬还有教练去外面吃了一顿火锅,选的微辣但是我还是有点接受不了。北方人没吃过油碟。没有麻酱我们都有点奇怪。幸亏有冰红茶解辣。成......
  • NOI2023 D2T1 贸易
    图中不存在横插边,\(u\rightsquigarrowv\)可拆成\(u\rightsquigarrow\operatorname{lca}(u,v)\rightsquigarrowv\)计算。对\(u\rightsquigarrow\operatorname{lca}(u,v)\),不可能走第二类道路,树形DP统计每条边被经过的次数并累加答案即可,时间复杂度\(\mathcalO(2......
  • 省选 2023 D1T2 城市建造
    显然地,这\(t\)座城市一定由每个连通块出一座得来,换言之,新修建道路的两城市原来一定不连通。进一步可以想到,若选择了\(u,v\)两座城市且它们连通,则\(u\rightsquigarrowv\)上的所有城市都应被选择。更进一步地可以推出,若选择的城市同属一个点双,则该点双内的所有城市都应被......
  • NOI2023Day2T2
    \(36pts\)\(O(tqn^2)\)暴力即可\(40pts\)对于最朴素的暴力优化,从头到尾扫,如果已经当前位字符比出优先级,那么直接能判断了,没必要往后跑了,第15个性质B的也给跑过了,我没料到,不过数据强一点其实和20pts没区别\(性质A(60pts)\)没有想出来\(性质B(72pts)\)写这个性质只有12pts,但......
  • 【NOI2023】合并书本
    Description传送门SolutionPart1考虑一棵合并树,令\(ls_u,rs_u\)表示\(u\)的左右儿子,\(d_u\)表示\(u\)子树的最大深度,\(c_u\)表示\(u\)被合并的次数,令所有非叶非根节点对应\(2^d-1\)的和为\(S\),则答案为\(\sum_{i=1}^nc_iw_i+S\)。可以发现,我们只关心\(c......
  • lg9483 [NOI2023] 合并书本
    考虑对合并过程建一棵树。对于一个点\(x\),定义\(a_x\)表示它向上合并的时候,对答案造成的重量贡献的系数。定义一个点的层级\(d_x\)为它的两个儿子层级的较大值\(+1\)。我们称\(d\)更小的层级为更深的层级。那么层级为\(i\)的非根非叶子节点会对答案造成\(2^i-1\)的......
  • NOI2023 打金记
    扔到cnblogs上。##Day-4最后一场模拟赛,肯定要用力打啊!然而一题不会,呜呜呜。于是开始拼暴力,写了$90+60+60=210$,结果挂成$40+60+60=160$。T1我将题目转化为:对于一个排列,每次只改动三个位置,要求某个数的出现位置,我用了fhq-treap!维护一个桶就好了,不知道自己......
  • NOI2023 题解
    打的太shaber了,于是补补题。D1T1扫描线。首先我们可以容斥一下,答案为被一种操作覆盖到的减去被两种操作覆盖到的加上被三种操作覆盖到的。首先考虑只被一种操作覆盖到的,这很简单,直接上个区间颜色段推平就好了,顺便去了个重。接下来是有被斜线覆盖到的,这样的点数为\(O(nk)\)......
  • P9481 [NOI2023] 贸易 题解
    题目链接题目要求我们求出任意两点间最短路径之和,由于图比较特殊,除树边外只有祖先到其子树内的边,我们首先考虑最短路径有没有什么特殊性质。注意到两点之间的最短路分为一下三种:节点到其祖先的最短路:直接沿着树边向上走即可,否则一定会走多余的边,不是最优。节点到其子树的......
  • NOI2023 后记
    Day1被找规律随机区分\(35\)分。Day2以我现有的水平已经无力回天了,d2T3却还挂了\(35\)分。连队线的边都没碰到,只混到了\(100\)多名的Ag。我不愿回忆这场考试的任何细节,知道寄了就行了。分数是从低往高排的。nfls的众人中,我是第一个上去的。为什么在公布Ag名单时,......