Codeforces F. Cowmpany Cowmpensation】的更多相关文章

Description 有一棵树,现在要给每个节点赋一个在1到D之间的权值,问有多少种方案满足任意一个节点的权值都不大于其父亲的权值. n<=3000,D<=1e9 题面 Solution 容易发现 \(f(D)\) 是一个 \(n\) 次多项式. 求出 \(f(1),f(2),...,f(n+1)\) 之后拉格朗日插值即可. #include<bits/stdc++.h> using namespace std; const int N=3010,mod=1e9+7; int n…
题目传送门 传送点I 传送点II 传送点III 题目大意 给定一个棵$n$个点的有根树和整数$D$,给这$n$个点标号,要求每个节点的标号是正整数,且不超过父节点的标号,根节点的标号不得超过D. 很容易地能得到$O(nD)$的动态规划:设$f[i][j]$表示$i$号点标为$j$在它的子树内的方案数. 写写它的转移方程:$f[i][j] = \prod_{s \in Son(i)}\sum_{k = 1}^{j} f[s][k]$. 设$g[i][j]=\sum_{k = 1}^{j}f[i][…
给一个树,每个点的权值为正整数,且不能超过自己的父节点,根节点的最高权值不超过D 问一共有多少种分配工资的方式? 题解: A immediate simple observation is that we can compute the answer in $O(nD) $with a simple dynamic program. How to speed it up though? To speed it up, we need the following lemma. Lemma 1: F…
传送门 题意: 给出一颗树,每个结点有取值范围\([1,D]\). 现在有限制条件:对于一个子树,根节点的取值要大于等于子数内各结点的取值. 问有多少种取值方案. 思路: 手画一下发现,对于一颗大小为\(sz\)的数,最终的答案为一个\(sz+1\)次为最高次幂的多项式. 因为节点数\(n\leq 3000\),所以暴力求出后插值即可. 简略证明:对于一个链,显然,一个长度为\(x\)的链,最终的结果为\(x+1\)次的多项式:考虑两条链的合并:长度为\(x\)的链和长度为\(y\)的链,显然两…
题意:一个数,每个节点取值是1-d,父亲比儿子节点值要大,求方案数 题解:\(dp[u][x]=\prod_{v}\sum_{i=1}^xdp[v][i]\),v是u的子节点,先预处理出前3000项,如果d大于3000,用这些结果插值即可 //#pragma GCC optimize(2) //#pragma GCC optimize(3) //#pragma GCC optimize(4) //#pragma GCC optimize("unroll-loops") //#pragm…
CF995F Cowmpany Cowmpensation Solution 这道题目可以看出我的代码能力是有多渣(代码能力严重退化) 我们先考虑dp,很容易写出方程: 设\(f_{i,j}\)表示以\(i\)为根的子树中\(i\)的值为\(j\),那么转移为: \[ \begin{aligned} f_{i,j}=\prod_{v\in son_u}\sum_{k=1}^j{f_{v,j}} \end{aligned} \] 这个东西很明显可以前缀和优化变成\(O(n^2)\)的求解. 当然不…
[CF995F]Cowmpany Cowmpensation(多项式插值) 题面 洛谷 CF 题解 我们假装结果是一个关于\(D\)的\(n\)次多项式, 那么,先\(dp\)暴力求解颜色数为\(0..n\)的所有方案数 这是一个\(O(n^2)\)的\(dp\) 然后直接做多项式插值就好了,公式戳这里 #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #inclu…
[CF995F]Cowmpany Cowmpensation 题面 树形结构,\(n\)个点,给每个节点分配工资\([1,d]\),子节点不能超过父亲节点的工资,问有多少种分配方案 其中\(n\leq3000,d\leq10^9\) 题解 先上一个\(O(nd)\)的\(dp\): 设\(f[u][j]\)表示点\(u\)分配的工资为\(j\)的方案数 那么转移时: 先转移\(f[u][j]=\prod_{v\in son_u}f[v][j]\) 再转移\(f[u][j]=f[u][j]+f[u…
codeforces description 一棵\(n\)个节点的树,给每个节点标一个\([1,m]\)之间的编号,要求儿子的权值不大于父亲权值.求方案数.\(n\le3000,n\le10^9\) sol 可以证明答案是关于\(m\)的一个\(n\)次多项式.我不会证. 如果\(P(x)\)是关于\(x\)的\(n\)次多项式,则有 \[P(x)=\sum_{i=0}^{n}(-1)^{n-i}P(i)\frac{x(x-1)...(x-n)}{(n-i)!i!(x-i)}\] 可见杜教\(…
题意 给你一棵树,你要用不超过 \(D\) 的权值给每个节点赋值,保证一个点的权值不小于其子节点,问有多少种合法的方案. \(n\leq 3000, D\leq 10^9\) 分析 如果 \(D\) 比较小的话可以考虑状态 \(f_{i,j}\) 表示点 \(i\) 的权值是 \(j\) 的方案总数,\(g_{i,j}\) 表示 \(\sum_\limits{k=1}^jf_{i,j}\) ,转移也比较显然:\(f_{i,j}=\prod g_{son,j}\) 先证明结论:前 \(n\) 个正…