luogu P4183 [USACO18JAN]Cow at Large P
首先考虑N^2做法,每次从一个点出发,如果到达一个点,然后到达这个点的时间\(\le\)离这个点最近的叶子距离\(di_x\),那么答案+1,否则继续找点
这个暴力很不好优化.可以这样认为,如果某个点贡献答案,那么子树里的点也要贡献答案(某个点走不下去,那么走子树内的点也走不下去,也符合条件),不过一个子树一共只贡献1.可以发现一个子树度数和\(\sum deg_i\),加上1为子树大小*2,即\(\sum 2-deg_i=1\),所以单次询问的答案就是所有符合条件的点的\(2-deg_i\)之和
现在考虑每个点对(x,y),y对x的贡献,要满足\(dis_{x,y}\le di_y\).考虑点分治,那么记某个点到分治重心距离为\(dep_x\),那么对x造成贡献的点y要满足\(dep_x+dep_y\le di_y\),即\(dep_x\le di_y-dep_y\),那么这个可以树状数组快速算贡献
// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define LL long long
#define uLL unsigned long long
#define il inline
#define re register
using namespace std;
const int N=7e4+10;
il int rd()
{
int x=0,w=1;char ch=0;
while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
int to[N<<1],nt[N<<1],hd[N],dg[N],tot=1;
il void add(int x,int y)
{
++tot,to[tot]=y,nt[tot]=hd[x],hd[x]=tot,++dg[x];
++tot,to[tot]=x,nt[tot]=hd[y],hd[y]=tot,++dg[y];
}
int n,fa[N],dd[N];
void dfs1(int x)
{
dd[x]=dg[x]==1?0:n+1;
for(int i=hd[x];i;i=nt[i])
{
int y=to[i];
if(y!=fa[x])
{
fa[y]=x,dfs1(y);
if(dd[x]>dd[y]+1) dd[x]=dd[y]+1;
}
}
}
void dfs2(int x)
{
for(int i=hd[x];i;i=nt[i])
{
int y=to[i];
if(y!=fa[x])
{
if(dd[y]>dd[x]+1) dd[y]=dd[x]+1;
dfs2(y);
}
}
}
int c[N<<1];
il void ad(int x,int y){while(x<=n+n) c[x]+=y,x+=x&(-x);}
il int gsm(int x){int an=0;while(x) an+=c[x],x-=x&(-x);return an;}
bool ban[N];
int sz[N],size,rt,rsz,st[N][2],tp,an[N];
void grt(int x,int ffa)
{
sz[x]=1;
int ma=0;
for(int i=hd[x];i;i=nt[i])
{
int y=to[i];
if(y!=ffa&&!ban[y])
{
grt(y,x),sz[x]+=sz[y];
ma=max(ma,sz[y]);
}
}
ma=max(ma,size-sz[x]);
if(ma<rsz) rsz=ma,rt=x;
}
void dfs3(int x,int ffa,int de)
{
st[++tp][0]=de,st[tp][1]=x;
for(int i=hd[x];i;i=nt[i])
{
int y=to[i];
if(y!=ffa&&!ban[y]) dfs3(y,x,de+1);
}
}
void cal(int x,int ffa,int op)
{
tp=0,dfs3(x,ffa,ffa>0);
for(int i=1;i<=tp;++i) ad(dd[st[i][1]]-st[i][0]+n,2-dg[st[i][1]]);
for(int i=1;i<=tp;++i) an[st[i][1]]+=op*gsm(st[i][0]+n);
for(int i=1;i<=tp;++i) ad(dd[st[i][1]]-st[i][0]+n,-(2-dg[st[i][1]]));
}
void sov(int x)
{
rt=0,rsz=size,grt(x,0);
x=rt;
cal(x,0,1),ban[x]=1;
for(int i=hd[x];i;i=nt[i])
if(!ban[to[i]])
{
int y=to[i];
cal(y,x,-1);
size=sz[y],sov(y);
}
}
int main()
{
n=rd();
for(int i=1;i<n;++i) add(rd(),rd());
dfs1(1),dfs2(1);
size=n,sov(1);
for(int i=1;i<=n;++i) printf("%d\n",dd[i]?an[i]:1);
return 0;
}
luogu P4183 [USACO18JAN]Cow at Large P的更多相关文章
- [洛谷P4183][USACO18JAN]Cow at Large P
题目链接 Bzoj崩了之后在洛谷偶然找到的点分好题! 在暴力的角度来说,如果我们$O(n)$枚举根节点,有没有办法在$O(n)$的时间内找到答案呢? 此时如果用树形$dp$的想法,发现是可做的,因为可 ...
- 洛谷 P4183 - [USACO18JAN]Cow at Large P(点分治)
洛谷题面传送门 点分治 hot tea. 首先考虑什么样的点能够对以 \(u\) 为根的答案产生 \(1\) 的贡献.我们考虑以 \(u\) 为根对整棵树进行一遍 DFS.那么对于一个点 \(v\), ...
- [USACO18JAN]Cow at Large G(树形DP)
P4186 [USACO18JAN]Cow at Large G(树形DP) Luogu4186 设dp[i]表示i点需要放多少个农民.则有 \(if(near[i]-dep[i]<=dep[i ...
- [USACO18JAN]Cow at Large P
Description: 贝茜被农民们逼进了一个偏僻的农场.农场可视为一棵有 \(N\) 个结点的树,结点分别编号为 \(1,2,\ldots, N\) .每个叶子结点都是出入口.开始时,每个出入口都 ...
- P4186 【[USACO18JAN]Cow at Large G】
思路是覆盖子树,我们发现,农民想截住牛的最优策略是不断向上来尽可能地覆盖更大的子树 我们想要尽早地覆盖一个子树,一个显然的贪心是在这个子树中选取深度最小的一个放农民 如果我们在一个点放置了农民,那么其 ...
- [USACO18JAN] Cow at Large G (dfs)
题目大意:有一只狐狸从给定的S点开始逃跑(出发),向叶节点移动以逃离这棵树,叶节点可能出现农民去抓捕狐狸,当农民和狐狸出现在同一个节点的时候,狐狸会被抓住,农民和狐狸移动速度相同,求抓捕狐狸所需要的最 ...
- luogu P1821 Silver Cow Party
题目描述 One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1..N is going to attend the b ...
- luogu P4183 Cow at Large P (暴力吊打点分治)(内有时间复杂度证明)
题面 贝茜被农民们逼进了一个偏僻的农场.农场可视为一棵有N个结点的树,结点分别编号为 1,2,-,N .每个叶子结点都是出入口.开始时,每个出入口都可以放一个农民(也可以不放).每个时刻,贝茜和农民都 ...
- [LUOGU] P3611 [USACO17JAN]Cow Dance Show奶牛舞蹈
https://www.luogu.org/problemnew/show/P3611 二分答案+优先队列 二分O(logn) 判一次正确性O(nlogn) 总体O(nlognlogn) 为了让pri ...
随机推荐
- BZOJ3512 DZY Loves Math IV
解:这又是什么神仙毒瘤题...... 我直接把后面那个phi用phi * I = id反演一波,得到个式子,然后推不动了...... 实际上第一步我就大错特错了.考虑到n很小,我们有 然后计算S,我们 ...
- LOJ#2542 随机游走
解:首先minmax容斥变成经过集合t的第一个点就停止的期望步数.对于某个t,设从x开始的期望步数为f(x) 如果x∈t,f(x) = 0.否则f(x) = ∑f(y) / in[x] + 1 树上高 ...
- Summary of Java basics review data
1.标识符 用于命名程序的对象,如方法名,变量名,规则是: a.大小写敏感 b.由英文字符,文字字符,美元符号,下划线和数字组成,但不能以数字开头 c.不能是关键字 2.%:求余运算符 ...
- 第四篇-以ConstraintLayout进行Android界面设计
此文章基于第三篇. 一.新建一个layout.xml文件,创建方法不再赘述,在Design界面右击LinearLayout,点击Convert LinearLayout to ConstraintLa ...
- 表格中的checkbox复选框 全选非全选 公共方法 及提交选中结果
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- 第七节,TensorFlow编程基础案例-TensorBoard以及常用函数、共享变量、图操作(下)
这一节主要来介绍TesorFlow的可视化工具TensorBoard,以及TensorFlow基础类型定义.函数操作,后面又介绍到了共享变量和图操作. 一 TesnorBoard可视化操作 Tenso ...
- Eclipse搭建SpringBoot之HelloWorld
你的eclipse需要先安装 Spring Tool Suite™ 第一种方法(不建议,之所以贴上是因为探索的过程) 首先新建Maven工程 勾选第一个按钮,第三个是选择working set ,你可 ...
- poj 3273"Monthly Expense"(二分搜索+最小化最大值)
传送门 https://www.cnblogs.com/violet-acmer/p/9793209.html 题意: 有 N 天,第 i 天会有 a[ i ] 的花费: 将这 N 天分成 M 份,每 ...
- 安卓和java开发环境的安装
java配置安卓需要,sdk,jdk(java),adt,eclipse 对于jdk的配置和安装: 1 卸载原来的jdk,重新配置环境变量只需要:在系统变量中把新的jdkJ安装路径写到“JAVA_HO ...
- POE 供电
受电设备(PD)和供电设备(PSE) 标准的五类网线有四对双绞线但是在10M BASE-T和100M BASE-T中只用到其中的两对.IEEE80 2.3af允许两种用法: 1.应用空闲脚供电时4.5 ...