[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)<= ...
随机推荐
- 我是怎么用python模仿勒索软件加密文件的(病毒)
前言: 今天下午上学,用python写个勒索脚本然后打包成exe是个不错的选择 我们来搞事情吧.看那学校我就不想上学. 0x01:要用到的模块,各位请自行准备 import win32api,win3 ...
- FB联网无人机取得重大进展 实现首次成功着陆
科技讯6月30日消息,据Engadget报道,在过去的几年里,世界最大社交网络Facebook始终在测试其太阳能无人飞机Aquila.2016年6月份,这种联网无人机在美国亚利桑那州的尤马进行了首次全 ...
- MIS系统部署方案
- Android 4 学习(12):Linkify & Broadcast event
参考<Professional Android 4 Development> Linkify Linkfy类可以在Text View中创建超链接.匹配LInkify中正则表达式的文本将被L ...
- leetcode824
class Solution { public: void SplitString(const string& s, vector<string>& v, const st ...
- springMVC第一天
这些是springMVC3.2所用到的jar包 web.xml配置 <?xml version="1.0" encoding="UTF-8"?> & ...
- Redhat 下添加用户到docker用户组
1. 检查系统中是否存在docker用户组,如果没有则手动添加 # sudo cat /etc/group |grep docker # sudo grouped -g 999 docker # -g ...
- 哪些 IT 职位难以替代,竞争力强?
原文出自知乎:http://www.zhihu.com/question/24795311 有10多年的软件行业经验,只针对软件行业来回答这个问题: 很少有无法替代的职位,只能说替代的成本高低而已. ...
- Professional C# 6 and .NET Core 1.0 - Chapter 38 Entity Framework Core
本文内容为转载,重新排版以供学习研究.如有侵权,请联系作者删除. 转载请注明本文出处:Professional C# 6 and .NET Core 1.0 - Chapter 38 Entity F ...
- UVa 10245 The Closest Pair Problem (分治)
题意:给定 n 个点,求最近两个点的距离. 析:直接求肯定要超时的,利用分治法,先把点分成两大类,答案要么在左边,要么在右边,要么一个点在左边一个点在右边,然后在左边或右边的好求,那么对于一个在左边一 ...