[Agc008F]Black Radius
[AGC008F] Black Radius
Description
给你一棵有N个节点的树,节点编号为1到N,所有边的长度都为1
"全"对某些节点情有独钟,这些他喜欢的节点的信息会以一个长度为N的字符串s的形式给到你,具体一点就是对于1<=i<=N,si=1表示"全"喜欢节点i,为0表示"全"不喜欢节点i一开始的时候,所有的节点都是白色的,"全"会进行以下操作恰好一次:选择一个他喜欢的节点v和一个非负整数d,然后将所有与节点v距离不超过d的节点全部涂黑问进行操作之后,有多少种不同的涂色情况?两种情况不同当且仅当两种情况存在一个节点i的颜色不同
Input
第一行一个正整数N
接下来N-1行每行两个正整数\(x_i,y_i\)表示xi到yi有一条边最后一行一个字符串s
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<=N,s由0或1构成,并且s中最少有一个1
试题分析
神题了解一下?
第一感觉就是每个点与其最远点有关,那不妨就顺着这个思路往下走。
发现全局的重复情况最多,那么我们就拿出来单独考虑,设\(f(x,d)\)表示从\(x\)出发走\(d\)步的黑点集合。
考虑哪两个情况是重复的,当且仅当这两个点走若干步以后覆盖的点集是相同的。
由于可操作与不可操作点的区分和去重比较困难,所以先退而求其次:假设所有点都可以操作,那么有多少种情况?
对于一个状态\(f(x,d)\)相重复的点集\(f(y,d_2)\),\(x\rightarrow y\)上的点都满足\(f(x',d-dist(x,x'))=f(x,d)\)
证明的话分类讨论证明即可。
那么我们就可以得出如下结论:
- \(f(x,d)\)不为全集。
- \(f(x,d)\)和\(f(y,d-1)\)不同,其中\((u,v)\in E\)
第一个好求,就是\(d\in [0,maxout(x)]\)。
考虑第二个怎么dp出来:我们思考一种情况重合,是点\(x\)为根时从它的最大深度子树中来,因为最大深度子树中的点经过拓展可以将剩下的所有分支填满,而没有重合的方案是存在不在最大深度子树中的一个分支还没有被填满,因为这种情况在最大深度子树中的点无论如何也无法重合,所以\(d\)的区间是\(d\in [0,premaxdis(i)+1]\)。
下面就来考虑带可操作点的情况,显然可操作点无限制,有距离限制的就是不可操作点。
不可操作点中, 让一些不可操作点的个数来替代这些可操作点来挽回我们把不可操作点与可操作点去了重。
当然,一个不可操作点首先要能覆盖一个可操作点才能代表这个可操作点的一部分操作。
再考虑去重的方式:我们将最大的分支去掉去了一个重,但是实际上这个最大分支中存在白点,这里的白点就需要覆盖半张图,也就是将这个白点置为根,然后将存在黑点的那些分支的深度取\(min\)就是我们所要的区间下界
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
#define LL long long
inline int read(){
int x=0,f=1; char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=getchar()) x=x*10+c-'0';
return x*f;
}
const int INF = 2147483600;
const int MAXN = 300010;
bool vis[MAXN<<1]; int Node[MAXN<<1],Root[MAXN<<1],Next[MAXN<<1],cnt;
int N,sz[MAXN+1];LL f[MAXN+1][2],g[MAXN+1],all;
int s[MAXN+1]; char str[MAXN+1]; LL bal[MAXN+1];
inline void insert(int u,int v){
Node[++cnt]=v; Next[cnt]=Root[u]; Root[u]=cnt; return ;
}
inline void dfs(int k,int Fa){
s[k]=sz[k]=(str[k]=='1'); all+=(str[k]=='1');
bal[k]=(str[k]=='1')?0:INF;
for(int x=Root[k];x;x=Next[x]){
int v=Node[x]; if(v==Fa) continue;
dfs(v,k);
if(f[v][0]+1>=f[k][0]){
f[k][1]=f[k][0];
f[k][0]=f[v][0]+1; g[k]=v;
} else if(f[v][0]+1>=f[k][1]){
f[k][1]=f[v][0]+1;
} if(sz[v]) bal[k]=min(bal[k],f[v][0]+1);
sz[k]+=sz[v];
} return ;
}
LL ans=0;
inline void dfs2(int k,int Fa,LL now){
ans+=max(min(f[k][0],f[k][1]+2)-bal[k],0LL); LL nowv;
for(int x=Root[k];x;x=Next[x]){
int v=Node[x]; if(v==Fa) continue;
if(g[k]==v) nowv=max(now,f[k][1])+1;
else nowv=max(now,f[k][0])+1;
if(nowv>=f[v][0]){
f[v][1]=f[v][0]; f[v][0]=nowv;
} else f[v][1]=max(f[v][1],nowv);
if(all-sz[v]) bal[v]=min(bal[v],nowv);
dfs2(v,k,nowv);
} return ;
}
int main(){
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
N=read();
for(int i=2;i<=N;i++){
int u=read(),v=read();
insert(u,v); insert(v,u);
} scanf("%s",str+1);
dfs(1,0); dfs2(1,0,0);
printf("%lld\n",ans+1);
return 0;
}
[Agc008F]Black Radius的更多相关文章
- 2017国家集训队作业[agc008f]Black Radius
2017国家集训队作业[agc008f]Black Radius 时隔4个月,经历了省赛打酱油和中考各种被吊打后,我终于回想起了我博客园的密码= = 题意: 给你一棵树,树上有若干个关键点.选中某 ...
- 【做题】agc008f - Black Radius——计数&讨论&思维
原文链接 https://www.cnblogs.com/cly-none/p/9794411.html \[ \newcommand{\stif}[2]{\left[ \begin{matrix} ...
- [agc008f] Black Radius 树形dp
Description 给你一棵有NN个节点的树,节点编号为11到NN,所有边的长度都为11 "全"对某些节点情有独钟,这些他喜欢的节点的信息会以一个长度为NN的字符串ss ...
- [AGC008F] Black Radius(树形dp)
神题啊!! Description 给你一棵有N个节点的树,节点编号为1到N,所有边的长度都为1 "全"对某些节点情有独钟,这些他喜欢的节点的信息会以一个长度为N的字符串s的形式给 ...
- AtCoder刷题记录
构造题都是神仙题 /kk ARC066C Addition and Subtraction Hard 首先要发现两个性质: 加号右边不会有括号:显然,有括号也可以被删去,答案不变. \(op_i\)和 ...
- 【agc008F】Black Radius
Portal --> agc008F Solution 这题好神仙啊qwq疯狂orz看懂日文题解的sjk太强啦qwq 首先我们要统计的东西,是一个涂黑的连通块,然后我们考虑找一个 ...
- BAS/BRAS/RADIUS简介
标签: java radius协议 linux radius认证服务器 转自: http://blog.csdn.net/sun93732/article/details/5999274 由R ...
- Creating a radius based VPN with support for Windows clients
This article discusses setting up up an integrated IPSec/L2TP VPN using Radius and integrating it wi ...
- Java处理Radius access-challenge
最近使用 RSA Authentication Manager, 并且与其自带的Radius server整合, RSA的Radius server 配置不太透明, 目前只配成功了PAP方式的验证,C ...
随机推荐
- Python 关于拷贝(copy)汇总(列表拷贝 // 字典拷贝 // 自定义对象拷贝)
1.列表拷贝 引用是指保存的值为对象的地址.在 Python 语言中,一个变量保存的值除了基本类型保存的是值外,其它都是引用,因此对于它们的使用就需要小心一些.下面举个例子: 问题描述:已知一个列表, ...
- Linux 入门记录:五、vi、vim 编辑器
一.vi.vim编辑器 vi 是一个命令行界面下的文本编辑工具,最早在 1976 年由 Bill Joy 开发.当时名字叫做 ex.vi 支持绝大多数操作系统(最早在类 Unix 操作系统的 BSD上 ...
- 天气api接口
python调用天气api接口: http://www.sojson.com/open/api/weather/json.shtml?city=北京 http://www.sojson.com/blo ...
- MariaDB 复合语句和优化套路
测试环境准备 本文主要围绕的对象是mariadb 高级语法, 索引优化, 基础sql语句调优. 下面那就开始搭建本次测试的大环境. 首先下载mariadb开发环境, 并F5 run起来. 具体参照 ...
- mysql utf8改utf8mb4
由于需要用到utf8mb4,之前是utf8现在给改成utf8mb4 查看当前环境 SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' ...
- [How to] 动态布局可变高度的cell的应用
1.简介 代码:https://github.com/xufeng79x/DynamicChangeableCell 微博界面,微信和QQ聊天界面,这些界面的布局大都不确定,且每一条消息的高度也不一样 ...
- NFS+inotify实时同步
Inotify简介 Inotify是一种文件系统事件通告机制,能够实时监控文件系统下文件的访问.修改.删除等各种变化情况并将其作为事件通告给用户态应用程序.Linux内核从2.6.13版本后已经集成了 ...
- javascript 实现图片轮播和点击切换功能
图片轮播是网页上一个比较常见的功能,下面我们来实现他吧 原理很简单: 1:固定的区域,所有的图片重叠,一次只能显示一张图片 2:通过改变图片的zIndex属性改变显示的图片,就可以达到切换的效果了 & ...
- MapReduce案例一:天气温度
1.需求 2.思路 3.代码实现 3.1MyWeather 类代码: 这个类主要是用来定义hadoop的配置,在执行计算程序时所需加载的一些类. package com.hadoop.mr.weath ...
- 《深入浅出MyBatis技术原理与实战》——4. 映射器,5. 动态SQL
4.1 映射器的主要元素 4.2 select元素 4.2.2 简易数据类型的例子 例如,我们需要统计一个姓氏的用户数量.应该把姓氏作为参数传递,而将结果设置为整型返回给调用者,如: 4.2.3 自动 ...