[agc008f] Black Radius 树形dp
Description
给你一棵有NN个节点的树,节点编号为11到NN,所有边的长度都为11
"全"对某些节点情有独钟,这些他喜欢的节点的信息会以一个长度为NN的字符串ss的形式给到你,具体一点就是对于1<=i<=N1<=i<=N,si=1si=1表示"全"喜欢节点ii,为00表示"全"不喜欢节点ii
一开始的时候,所有的节点都是白色的,"全"会进行以下操作恰好一次:
选择一个他喜欢的节点vv和一个非负整数dd,然后将所有与节点vv距离不超过dd的节点全部涂黑
问进行操作之后,有多少种不同的涂色情况?两种情况不同当且仅当两种情况存在一个节点ii的颜色不同
Input
第一行一个正整数NN
接下来N−1N−1行每行两个正整数xi,yixi,yi表示xixi到yiyi有一条边
最后一行一个字符串ss
Output
输出不同染色情况的数量
Sample Input
#Sample1
4
1 2
1 3
1 4
1100
#Sample2
5
1 2
1 3
1 4
4 5
11111
#Sample3
6
1 2
1 3
1 4
2 5
2 6
100011
Sample Output
#Sample1
4
#Sample2
11
#Sample3
8
HINT
数据范围:
对于100%的数据,2<=N<=2∗105,1<=xi,yi<=N2<=N<=2∗105,1<=xi,yi<=N,s由00或11构成,并且ss中最少有一个11
样例解释:
Sample1:
Sol
真的是神题,以下翻译的是官方题解。。。
Code
#include <bits/stdc++.h>
using namespace std;
vector<int>e[200005];char s[200005];long long ans;
int x,y,n,tot,cnt[200005],d1[200005],d2[200005],R[200005],L[200005];
int dfs1(int x,int fa)
{
for(int i=0;i<e[x].size();i++) if(e[x][i]!=fa)
{
cnt[x]+=dfs1(e[x][i],x);
if(d1[e[x][i]]+1>d1[x]) d2[x]=d1[x],d1[x]=d1[e[x][i]]+1;
else if(d1[e[x][i]]+1>d2[x]) d2[x]=d1[e[x][i]]+1;
}
return cnt[x]+=s[x]-'0';
}
void dfs2(int x,int fa,int v)
{
R[x]=v>d1[x]?d1[x]:max(v,d2[x]),L[x]=(s[x]-'0')?0:(tot-cnt[x]?v:1e9);
if(fa)
{
if(d1[x]==v-1) ans++;
else if(d1[x]<v-1) ans+=(cnt[x]>0);
else ans+=(tot-cnt[x]>0);
}
for(int i=0;i<e[x].size();i++) if(e[x][i]!=fa)
{
if(cnt[e[x][i]]) L[x]=min(L[x],d1[e[x][i]]+1);
if(d1[e[x][i]]+1==d1[x]) dfs2(e[x][i],x,max(v+1,d2[x]+1));
else dfs2(e[x][i],x,max(v+1,d1[x]+1));
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<n;i++) scanf("%d%d",&x,&y),e[x].push_back(y),e[y].push_back(x);
scanf("%s",s+1);
for(int i=1;i<=n;i++) tot+=s[i]-'0';
dfs1(1,0);dfs2(1,0,0);
for(int i=1;i<=n;i++) if(L[i]<=R[i]) ans+=(R[i]-L[i]+1);
printf("%lld\n",ans);
}
[agc008f] Black Radius 树形dp的更多相关文章
- [AGC008F] Black Radius(树形dp)
神题啊!! Description 给你一棵有N个节点的树,节点编号为1到N,所有边的长度都为1 "全"对某些节点情有独钟,这些他喜欢的节点的信息会以一个长度为N的字符串s的形式给 ...
- [Agc008F]Black Radius
[AGC008F] Black Radius Description 给你一棵有N个节点的树,节点编号为1到N,所有边的长度都为1 "全"对某些节点情有独钟,这些他喜欢的节点的信息 ...
- 2017国家集训队作业[agc008f]Black Radius
2017国家集训队作业[agc008f]Black Radius 时隔4个月,经历了省赛打酱油和中考各种被吊打后,我终于回想起了我博客园的密码= = 题意: 给你一棵树,树上有若干个关键点.选中某 ...
- poj3417 LCA + 树形dp
Network Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4478 Accepted: 1292 Descripti ...
- COGS 2532. [HZOI 2016]树之美 树形dp
可以发现这道题的数据范围有些奇怪,为毛n辣么大,而k只有10 我们从树形dp的角度来考虑这个问题. 如果我们设f[x][k]表示与x距离为k的点的数量,那么我们可以O(1)回答一个询问 可是这样的话d ...
- 【BZOJ-4726】Sabota? 树形DP
4726: [POI2017]Sabota? Time Limit: 20 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 128 Solved ...
- 树形DP+DFS序+树状数组 HDOJ 5293 Tree chain problem(树链问题)
题目链接 题意: 有n个点的一棵树.其中树上有m条已知的链,每条链有一个权值.从中选出任意个不相交的链使得链的权值和最大. 思路: 树形DP.设dp[i]表示i的子树下的最优权值和,sum[i]表示不 ...
- 树形DP
切题ing!!!!! HDU 2196 Anniversary party 经典树形DP,以前写的太搓了,终于学会简单写法了.... #include <iostream> #inclu ...
- BZOJ 2286 消耗战 (虚树+树形DP)
给出一个n节点的无向树,每条边都有一个边权,给出m个询问,每个询问询问ki个点,问切掉一些边后使得这些顶点无法与顶点1连接.最少的边权和是多少.(n<=250000,sigma(ki)<= ...
随机推荐
- LINUX免密登陆
ssh 无密码登录要使用公钥与私钥.linux下可以用用ssh-keygen生成公钥/私钥对,下面我以CentOS为例. 有机器A(192.168.1.155),B(192.168.1.181).现想 ...
- C++深度解析教程学习笔记(4)C++中的新成员
1. 动态内存分配 (1)C++通过 new 关键字进行动态内存申请,是以类型为单位来申请空间大小的 (2)delete 关键字用于内存释放 ▲注意释放数组时要加[],否则只释放这个数组中的第 1 个 ...
- logback-spring.xml的schema
<?xml version="1.0" encoding="utf-8" ?> <configuration xmlns:xsi=" ...
- c++ 流状态
这里是对cin中函数的作用的补充.
- laravel中的数据库操作(增删改查)方法一
导入命名空间和DBnamespace App\Http\Controllers; use Illuminate\Support\Facades\DB; public function index(){ ...
- 张超超OC基础回顾01_类的创建,申明属性,以及本质
一. 类的声明和实现&规则 1.如何编写类的声明 以@interface开头 , 以@end结尾, 然后再class name对应的地方写上 事物名称, 也就是类名即可 注意: 类名的首字符必 ...
- “Device eth0 has different MAC address than expected, ignoring.”问题
配IP后进行激活的时候提示如下错误:("Device eth0 has different MAC address than expected, ignoring.") 百度了下, ...
- 01 git 概念
本文转自“廖雪峰的git教程” 集中式版本控制系统:版本库是集中存放在中央服务器的,中央服务器就好比是一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆. 分布式版 ...
- easyui-dialog 弹窗
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
- mxnet 线性模型
mxnet 线性模型 li {list-style-type:decimal;}ol.wiz-list-level2 > li {list-style-type:lower-latin;}ol. ...