Codeforces 543D Road Improvement(DP)
Solution
比较明显的树形DP模型。
首先可以先用一次DFS求出以1为根时,sum[i](以i为子树的根时,满足要求的子树的个数)。
考虑将根从i变换到它的儿子j时,sum[i]产生的变化.
在变化前sum[i]不为0时,可以用求逆元的方法求出新的sum[i].
sum[i]为0时,就需要遍历i的新的儿子.
官方的题解给出了一个比较好的做法是预处理i的儿子的前缀积,和后缀积.使用的时候只要去除相应的儿子.
#include <bits/stdc++.h>
#define LL long long
using namespace std; const int N = ;
const int MOD = int (1e9 + ); struct edge {
int v, ne;
} E[N << ];
int head[N], cnt; LL sum[N], ans[N]; int n; LL Quikpower (LL Base, LL Power)
{
LL k = ;
while ( Power > ) {
if (Power & ) k = (k * Base) % MOD;
Base = (Base * Base) % MOD;
Power >>= ;
}
return k;
} inline void add (int u, int v)
{
E[++cnt].v = v, E[cnt].ne = head[u];
head[u] = cnt;
} void dfs (int u, int from)
{
sum[u] = ;
for (int i = head[u]; i; i = E[i].ne) {
int v = E[i].v;
if (v != from) {
dfs (v, u);
sum[u] = sum[u] * sum[v] % MOD;
}
}
if (from != ) ++sum[u];
} void dfs2 (int u, int from)
{
LL tem = ;
if (ans[from] != ) {
tem = ans[from] * Quikpower (sum[u], MOD - ) % MOD + ;
}
else {
for (int i = head[from]; i; i = E[i].ne) {
int v = E[i].v;
if (v != u)
tem = tem * sum[v] % MOD;
}
tem++;
}
sum[from] = tem;
LL k = ;
for (int i = head[u]; i; i = E[i].ne) {
int v = E[i].v;
k = k * sum[v] % MOD;
}
ans[u] = k; int reset = sum[u];
for (int i = head[u]; i; i = E[i].ne) {
int v = E[i].v;
if (v != from) {
dfs2 (v, u);
sum[u] = reset;
}
}
}
int main()
{
ios::sync_with_stdio (); cin >> n;
for (int i = , x; i <= n; i++) {
cin >> x;
add (i, x), add (x, i);
} dfs (, ); dfs2 (, ); for (int i = ; i <= n; i++)
cout << (ans[i] + MOD) % MOD << " ";
}
Codeforces 543D Road Improvement(DP)的更多相关文章
- Codeforces 543D Road Improvement(树形DP + 乘法逆元)
题目大概说给一棵树,树的边一开始都是损坏的,要修复一些边,修复完后要满足各个点到根的路径上最多只有一条坏的边,现在以各个点为根分别求出修复边的方案数,其结果模1000000007. 不难联想到这题和H ...
- Codeforces 543D. Road Improvement (树dp + 乘法逆元)
题目链接:http://codeforces.com/contest/543/problem/D 给你一棵树,初始所有的边都是坏的,要你修复若干边.指定一个root,所有的点到root最多只有一个坏边 ...
- Codeforces Gym101341K:Competitions(DP)
http://codeforces.com/gym/101341/problem/K 题意:给出n个区间,每个区间有一个l, r, w,代表区间左端点右端点和区间的权值,现在可以选取一些区间,要求选择 ...
- codeforces 711C Coloring Trees(DP)
题目链接:http://codeforces.com/problemset/problem/711/C O(n^4)的复杂度,以为会超时的 思路:dp[i][j][k]表示第i棵数用颜色k涂完后bea ...
- codeforces#1154F. Shovels Shop (dp)
题目链接: http://codeforces.com/contest/1154/problem/F 题意: 有$n$个物品,$m$条优惠 每个优惠的格式是,买$x_i$个物品,最便宜的$y_i$个物 ...
- Codeforces 1051 D.Bicolorings(DP)
Codeforces 1051 D.Bicolorings 题意:一个2×n的方格纸,用黑白给格子涂色,要求分出k个连通块,求方案数. 思路:用0,1表示黑白,则第i列可以涂00,01,10,11,( ...
- Codeforces 1207C Gas Pipeline (dp)
题目链接:http://codeforces.com/problemset/problem/1207/C 题目大意是给一条道路修管道,相隔一个单位的管道有两个柱子支撑,管道柱子高度可以是1可以是2,道 ...
- Codeforces 704C - Black Widow(dp)
Codeforces 题目传送门 & 洛谷题目传送门 u1s1 感觉这种题被评到 *2900 是因为细节太繁琐了,而不是题目本身的难度,所以我切掉这种题根本不能说明什么-- 首先题目中有一个非 ...
- Codeforces 682B New Skateboard(DP)
题目大概说给一个数字组成的字符串问有几个子串其代表的数字(可以有前导0)能被4整除. dp[i][m]表示字符串0...i中mod 4为m的后缀的个数 通过在i-1添加str[i]字符转移,或者以st ...
随机推荐
- 导入 from pdfminer.pdfinterp import process_pdf 错误
>>> from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter>>> from ...
- Unity3d fur真实毛发渲染
放出效果图 使用的核心技术为曲面细分和置换贴图,Unity支持GPU的曲面细分,置换贴图为噪波,沿着法线拉伸即成为毛发.再随机减少最高点的高度产生毛刺的感觉 曲面细分之前有篇文章详细讲过 弄了前后ri ...
- jQuery 遍历
.add() add() 方法将元素添加到匹配元素的集合中 .add(selector)//字符串值,表示查找供添加到匹配元素集合的元素的选择器表达式. .add(elements)//添加到匹配元素 ...
- Bzoj 3809: Gty的二逼妹子序列 莫队,分块
3809: Gty的二逼妹子序列 Time Limit: 35 Sec Memory Limit: 28 MBSubmit: 868 Solved: 234[Submit][Status][Dis ...
- hdu1026 Ignatius and the Princess I (优先队列 BFS)
Problem Description The Princess has been abducted by the BEelzebub feng5166, our hero Ignatius has ...
- CMDLINE的解析
在linux的config文件中有一个特殊的宏定义CMDLINE,以前也一直在使用这个宏的参数,但是真正这个宏的解析和使用却不怎么明确.这次有机会多对它有些了解,不妨把这个浅显的认识说出来,记下来. ...
- localstorage 初谈
废话 : localStorage作为本地存储,比cookie大,可以看做一个小的服务器,几个api也可以看做增,删,查,找..... 设置 window.localStorage.setItem() ...
- jQuery之DOM
jQuery之DOM 1.jQuery属性. 获取元素属性的语法: attr(name) 例子:$("#img1").attr("sr ...
- MySQL Error Handling in Stored Procedures---转载
This tutorial shows you how to use MySQL handler to handle exceptions or errors encountered in store ...
- [转] Linux strace 简介
http://www.cnblogs.com/ggjucheng/archive/2012/01/08/2316692.html 简介 strace常用来跟踪进程执行时的系统调用和所接收的信号. 在L ...