CodeForces 543D:Road Improvement
题目:http://codeforces.com/problemset/problem/543/D
题意:给你一棵树,一开始边都是0,可以使任意的边变成1,对于每一个根节点求使得它到其他任一点的路径上只有一条0边的方案数。
假设只求一个根,f[u]=∏(s[v]+1)
然后移动根节点这样就可以通过遍历一遍树得到所有点的答案了。
s[v]=(s[u]/(s[v]+1)+1)*s[v] 这样当前根和根的其他子树就变成v的子树了(前面那坨就是它的贡献。。
(看起来是这样没错。。但是不能求逆元。因为s[u]可能为0 。。所以维护前缀和后缀bfs一遍就好了。。
- #include<cstring>
- #include<iostream>
- #include<cstdio>
- #include<algorithm>
- #include<queue>
- #include<map>
- #define rep(i,l,r) for (int i=l;i<=r;i++)
- #define down(i,l,r) for (int i=l;i>=r;i--)
- #define clr(x,y) memset(x,y,sizeof(x))
- #define maxn 200500
- #define maxk 69
- #define inf 0x7fffffff
- #define ll long long
- #define mm 1000000007
- using namespace std;
- struct data{int obj,pre;
- }e[maxn*];
- ll g[maxn],s[maxn],ans[maxn],pr[maxn],sc[maxn];
- int head[maxn],a[maxn],vis[maxn],n,tot;
- int read(){
- ll x=,f=; char ch=getchar();
- while (!isdigit(ch)){if (ch=='-') f=-; ch=getchar();}
- while (isdigit(ch)){x=x*+ch-''; ch=getchar();}
- return x*f;
- }
- void insert(int x,int y){
- e[++tot].obj=y; e[tot].pre=head[x]; head[x]=tot;
- }
- ll ni(ll x){
- ll y=mm-,ans=;
- while (y){
- if (y&) ans=ans*x%mm;
- x=x*x%mm;
- y>>=;
- }
- return ans;
- }
- ll dfs(int u,int f){
- s[u]=;
- for (int j=head[u];j;j=e[j].pre){
- int v=e[j].obj;
- if (v==f) continue;
- s[u]=s[u]*(dfs(v,u)+1LL)%mm;
- }
- return s[u];
- }
- void go(){
- g[]=;
- queue<int> q; clr(vis,); q.push();
- while (!q.empty()){
- int u=q.front(); q.pop(); vis[u]=;
- int sum=;
- for (int j=head[u];j;j=e[j].pre){
- int v=e[j].obj;
- if (!vis[v]) a[++sum]=v;
- }
- sort(a+,a++sum);
- pr[]=; rep(i,,sum) pr[i]=pr[i-]*(s[a[i]]+)%mm;
- sc[sum+]=g[u]; down(i,sum,) sc[i]=sc[i+]*(s[a[i]]+)%mm;
- rep(i,,sum) {
- s[a[i]]=(pr[i-]*sc[i+]%mm+)%mm*s[a[i]]%mm;
- g[a[i]]=(pr[i-]*sc[i+]%mm+)%mm;
- q.push(a[i]);
- }
- }
- }
- int main(){
- n=read();
- rep(i,,n) {
- int x=read(); insert(x,i); insert(i,x);
- }
- dfs(,);
- go();
- rep(i,,n-) printf("%lld ",s[i]%mm); printf("%lld\n",s[n]%mm);
- return ;
- }
CodeForces 543D:Road Improvement的更多相关文章
- VK Cup 2016 - Qualification Round 2 C. Road Improvement dfs
C. Road Improvement 题目连接: http://www.codeforces.com/contest/638/problem/C Description In Berland the ...
- Codeforces 543D. Road Improvement (树dp + 乘法逆元)
题目链接:http://codeforces.com/contest/543/problem/D 给你一棵树,初始所有的边都是坏的,要你修复若干边.指定一个root,所有的点到root最多只有一个坏边 ...
- Codeforces 543D Road Improvement
http://codeforces.com/contest/543/problem/D 题意: 给定n个点的树 问: 一开始全是黑边,对于以i为根时,把树边白染色,使得任意点走到根的路径上不超过一条黑 ...
- Codeforces 543D Road Improvement(树形DP + 乘法逆元)
题目大概说给一棵树,树的边一开始都是损坏的,要修复一些边,修复完后要满足各个点到根的路径上最多只有一条坏的边,现在以各个点为根分别求出修复边的方案数,其结果模1000000007. 不难联想到这题和H ...
- CodeForces 543D 树形DP Road Improvement
题意: 有一颗树,每条边是好边或者是坏边,对于一个节点为x,如果任意一个点到x的路径上的坏边不超过1条,那么这样的方案是合法的,求所有合法的方案数. 对于n个所有可能的x,输出n个答案. 分析: 题解 ...
- Codeforces 543D Road Improvement(DP)
题目链接 Solution 比较明显的树形DP模型. 首先可以先用一次DFS求出以1为根时,sum[i](以i为子树的根时,满足要求的子树的个数). 考虑将根从i变换到它的儿子j时,sum[i]产生的 ...
- Codeforces Round #302 (Div. 1) D - Road Improvement 树形dp
D - Road Improvemen 思路:0没有逆元!!!! 不能直接除,要求前缀积和后缀积!!! #include<bits/stdc++.h> #define LL long lo ...
- 【Codeforces 738C】Road to Cinema
http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...
- CodeForces 696A:Lorenzo Von Matterhorn(map的用法)
http://codeforces.com/contest/697/problem/C C. Lorenzo Von Matterhorn time limit per test 1 second m ...
随机推荐
- Android Weekly Notes Issue #288
Android Weekly Issue #288 December 17th, 2017 Android Weekly Issue #288 本期内容主要包括介绍Kotlin DSL使用kotlin ...
- Button的五种点击事件
1.内部类方式 class MyOnClickListener implements View.OnClickListener{ /** * Called when a view has been c ...
- 网关 php-cgi fastcgi phpfpm
本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/88 关于网关的理解,一句话就是:作为一种翻译器,抽象出了一种能够 ...
- Docker了解
Docker了解1.Docker能做什么:Docker能够解决虚拟机能够解决的问题,同时也能够解决虚拟机由于请求资源过高无法解决的问题. *隔离应用依赖 *创建应用镜像并进行复制 *创建容易分发的即启 ...
- HTML基本功之文档结构
项目名 首页 命名为 index.html 样式文件夹 命名为 css /*用来放样式文件*/ base.css /*基本样式*/ index.css /*首页样式*/ global.css /* ...
- 腾讯云主机 MySQL 远程访问配置方法
使用腾讯云主机安装 MySQL 之后,需要通过以下步骤进行配置以实现远程访问,主要分为两大部分 一.服务器端口配置 1.如果你的云主机配置了安全组,如果没有配置安全组就可以直接跳过“步骤1”的操作,否 ...
- Nodejs真.多线程处理
前言 Threads à gogo 是nodejs 的原生模块,使用这个模块可以让nodejs 具备多线程处理功能 安装方法 npm install threads_a_gogo 下载测试源码 git ...
- touch事件应用
js的touch事件,一般用于移动端的触屏滑动: $(function(){ document.addEventListener("touchmove", _touch, fals ...
- 【转】java jvm 线程 与操作系统线程
原文链接:http://segmentfault.com/q/1010000000370403 Java的目标是要跨平台,而不同的操作系统(如类Unix和Windows)其任务调度机制有很大的不同,故 ...
- NPOI 1.2 教程
NPOI 1.2 教程官方地址 很多人可能对NPOI还很陌生,别担心,通过本教程你将对NPOI有进一步的认识和理解. 目录 1. 认识NPOI 2. 使用NPOI生成xls文件 2.1 创建基本内容 ...