[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的更多相关文章

  1. 2017国家集训队作业[agc008f]Black Radius

    2017国家集训队作业[agc008f]Black Radius 时隔4个月,经历了省赛打酱油和中考各种被吊打后,我终于回想起了我博客园的密码= = 题意: ​ 给你一棵树,树上有若干个关键点.选中某 ...

  2. 【做题】agc008f - Black Radius——计数&讨论&思维

    原文链接 https://www.cnblogs.com/cly-none/p/9794411.html \[ \newcommand{\stif}[2]{\left[ \begin{matrix} ...

  3. [agc008f] Black Radius 树形dp

    Description ​ 给你一棵有NN个节点的树,节点编号为11到NN,所有边的长度都为11 ​ "全"对某些节点情有独钟,这些他喜欢的节点的信息会以一个长度为NN的字符串ss ...

  4. [AGC008F] Black Radius(树形dp)

    神题啊!! Description 给你一棵有N个节点的树,节点编号为1到N,所有边的长度都为1 "全"对某些节点情有独钟,这些他喜欢的节点的信息会以一个长度为N的字符串s的形式给 ...

  5. AtCoder刷题记录

    构造题都是神仙题 /kk ARC066C Addition and Subtraction Hard 首先要发现两个性质: 加号右边不会有括号:显然,有括号也可以被删去,答案不变. \(op_i\)和 ...

  6. 【agc008F】Black Radius

    Portal --> agc008F Solution  这题好神仙啊qwq疯狂orz看懂日文题解的sjk太强啦qwq ​   ​  首先我们要统计的东西,是一个涂黑的连通块,然后我们考虑找一个 ...

  7. BAS/BRAS/RADIUS简介

    标签: java radius协议   linux radius认证服务器   转自: http://blog.csdn.net/sun93732/article/details/5999274 由R ...

  8. 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 ...

  9. Java处理Radius access-challenge

    最近使用 RSA Authentication Manager, 并且与其自带的Radius server整合, RSA的Radius server 配置不太透明, 目前只配成功了PAP方式的验证,C ...

随机推荐

  1. 使用.net core abp framework

    abp是一个有用的框架,包含许多功能,可以用来作为脚手架. 直接在官方网站上输入相应的工程名称,选择对应的版本就会下载对应的版本..net core 版本的可以使用后端框架部分来做api,包含了常用框 ...

  2. 基于 python imageai 对象检测 目标检测 识别 视频

    1.视频连接如下: http://www.iqiyi.com/w_19s6vownit.html

  3. cookie、session、localstorage

    最早的Cookies问题主要就是太小,大概也就4KB的样子,而且IE6只支持每个域名20个cookies,太少了.优势就是大家都支持,而且支持得还蛮好.cookie的内容主要包括:名字,值,过期时间, ...

  4. Python自动化运维 - Django(二)Ajax基础 - 自定义分页

    Ajax基础 AJAX 不是新的编程语言,而是一种使用现有标准的新方法. AJAX 是与服务器交换数据并更新部分网页的艺术,在不重新加载整个页面的情况下. 什么是Ajax AJAX = 异步 Java ...

  5. Ubuntu 14.04开启ssh服务

    sudo apt-get install openssh-server sudo apt-get install openssh-client sudo service ssh restart

  6. 浅析MongoDB用户管理

    浅析MongoDB用户管理 http://www.jb51.net/article/53830.htm mongodb3.03开启认证 http://21jhf.iteye.com/blog/2216 ...

  7. 【bzoj3545】peaks

    离线一下,动态开点+线段树合并,然后权值线段树上询问kth即可. #include<bits/stdc++.h> ; *; using namespace std; ; inline in ...

  8. SSH认证原理和批量分发管理

    SSH密码认证原理 几点说明: 1.服务端/etc/ssh目录下有三对公钥私钥: [root@m01 ssh]# ls moduli ssh_config sshd_config ssh_host_d ...

  9. Bootstrap框架的简介

    一.Bootstrap介绍 Bootstrap是Twitter开源的基于HTML.CSS.JavaScript的前端框架. 它是为实现快速开发Web应用程序而设计的一套前端工具包. 它支持响应式布局, ...

  10. 机器学习方法:回归(二):稀疏与正则约束ridge regression,Lasso

    欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld. "机器学习方法"系列,我本着开放与共享(open and share)的精神撰写,目的是 ...