[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)<= ...
随机推荐
- CSS滤镜模糊效果
.blur { -webkit-filter: blur(6px); -moz-filter: blur(6px); -ms-filter: blur(6px); filter: blur(6px); ...
- php写一个判断是否有cookie的脚本
前言: 刚刚学习完cookie函数,写个练习. 0x01: //其实第二个应该改为elseif,但是我懒.啊哈 <?php $vlas="BnJhiFoPS4"; if(is ...
- 处理大数据对象clob数据和blob数据
直接上下代码: package com.learn.jdbc.chap06; import java.io.File; import java.io.FileInputStream; import j ...
- Java微信公众平台开发(十一)--开发中微信公众平台/开放平台/商户平台的关联
转自:http://www.cuiyongzhi.com/post/55.html 微信公众平台(map.weixin.qq.com)/开放平台(open.weixin.qq.com)/商户平台(pa ...
- C++深度解析教程学习笔记(4)C++中的新成员
1. 动态内存分配 (1)C++通过 new 关键字进行动态内存申请,是以类型为单位来申请空间大小的 (2)delete 关键字用于内存释放 ▲注意释放数组时要加[],否则只释放这个数组中的第 1 个 ...
- GBK/ UTF-8/ UNICODE(字符编码)
在python2中:如果执行程序,在编译器中,因为默认的编码是ASCII码(英文),所以如果输入中文就会出现乱码,因此为了避免这种乱码的情况发生,在输入中文字符串之后,必须进行手动转码,将GBK/ U ...
- java Web 请求servlet绘制验证码简单例子
主要用来了解java代码怎么绘制验证码图片,实际开发中不会这样用 protected void doGet(HttpServletRequest request, HttpServletRespons ...
- 转-使用wifi调试程序
转自:http://www.cnblogs.com/sunzhenxing19860608/archive/2011/07/14/2106492.html 数据线丢了,不想花钱去买,在网上看了看,an ...
- opennebula 对接创建模板参数
{ "id": 8, "name": "c5d1390c-1930-45a5-a686-5cef38b319d7", "displ ...
- java发送post 的json请求
package com.elink.estos.mq.mqmanager; import java.io.IOException; import java.io.InputStream; import ...