P4186 【[USACO18JAN]Cow at Large G】
思路是覆盖子树,我们发现,农民想截住牛的最优策略是不断向上来尽可能地覆盖更大的子树
我们想要尽早地覆盖一个子树,一个显然的贪心是在这个子树中选取深度最小的一个放农民
如果我们在一个点放置了农民,那么其他点也会被覆盖,所有这个农民能够覆盖的叶子都不需要再放农民了
抽象出来,对于每个叶节点,都有一个深度,我们把叶节点按深度排序,然后每次选取深度最浅的点打标记,然后枚举每个点,把这个点能覆盖的点全部删去
那么我们怎样支持这样一种操作呢,我们可以用一个$set$,每次取出$s.begin$,考虑它是否能够覆盖点$x$,能够覆盖的前提是$d[begin]-d[lca]<=d[lca]$,即农民比奶牛先或同时走到$lca$
复杂度我不会证,如果有大佬看到可以帮忙证一下
#include<iostream>
#include<cstdio>
#include<cstring>
#include<set>
using namespace std;
const int maxn=1e5+,lg=;
struct edge{
int next,to;
}e[maxn*];
struct node{
int d,id;
};
int n,k,head[maxn],cnt,ans,d[maxn],deg[maxn],sk[maxn][];
set<node>s;
bool operator <(const node &x,const node &y)
{
return x.d==y.d?x.id<y.id:x.d<y.d;
}
void add(int x,int y)
{
e[++cnt].next=head[x];
e[cnt].to=y;
head[x]=cnt;
}
void make(int x,int pre)
{
sk[x][]=pre,d[x]=d[pre]+;
if(deg[x]==)
s.insert((node){d[x],x});
for(int v,i=head[x];i;i=e[i].next)
if((v=e[i].to)!=pre)
make(v,x);
}
void equals(int &x,int h)
{
for(int i=;h;i++)
{
if(h&)
x=sk[x][i];
h>>=;
}
}
int lca(int x,int y)
{
if(d[x]<d[y])
swap(x,y);
equals(x,d[x]-d[y]);
if(x==y)
return x;
for(int i=lg;i>=;i--)
if(sk[x][i]!=sk[y][i])
x=sk[x][i],y=sk[y][i];
return sk[x][];
}
int main()
{
scanf("%d%d",&n,&k);
for(int x,y,i=;i<n;i++)
{
scanf("%d%d",&x,&y);
add(x,y),add(y,x);
deg[x]++,deg[y]++;
}
if(deg[k]==)
{
printf("1\n");
return ;
}
d[]=-;
make(k,);
for(int i=;i<=lg;i++)
for(int j=;j<=n;j++)
sk[j][i]=sk[sk[j][i-]][i-];
while(!s.empty())
{
node u=*s.begin();
ans++;
s.erase(s.begin());
for(set<node>::iterator it=s.begin();it!=s.end();)
{
node tmp=*it;
it++;
if(d[u.id]<=*d[lca(u.id,tmp.id)])
s.erase(tmp);
}
}
printf("%d\n",ans);
return ;
}
P4186 【[USACO18JAN]Cow at Large G】的更多相关文章
- [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 G (dfs)
题目大意:有一只狐狸从给定的S点开始逃跑(出发),向叶节点移动以逃离这棵树,叶节点可能出现农民去抓捕狐狸,当农民和狐狸出现在同一个节点的时候,狐狸会被抓住,农民和狐狸移动速度相同,求抓捕狐狸所需要的最 ...
- [洛谷P4183][USACO18JAN]Cow at Large P
题目链接 Bzoj崩了之后在洛谷偶然找到的点分好题! 在暴力的角度来说,如果我们$O(n)$枚举根节点,有没有办法在$O(n)$的时间内找到答案呢? 此时如果用树形$dp$的想法,发现是可做的,因为可 ...
- 【Heaven Cow与God Bull】题解
题目 Description __int64 ago,there's a heaven cow called sjy... A god bull named wzc fell in love with ...
- luogu P4183 [USACO18JAN]Cow at Large P
传送门 首先考虑N^2做法,每次从一个点出发,如果到达一个点,然后到达这个点的时间\(\le\)离这个点最近的叶子距离\(di_x\),那么答案+1,否则继续找点 这个暴力很不好优化.可以这样认为,如 ...
- [USACO18JAN]Cow at Large P
Description: 贝茜被农民们逼进了一个偏僻的农场.农场可视为一棵有 \(N\) 个结点的树,结点分别编号为 \(1,2,\ldots, N\) .每个叶子结点都是出入口.开始时,每个出入口都 ...
- 题解 P6005 【[USACO20JAN]Time is Mooney G】
抢第一篇题解 这题的思路其实就是一个非常简单的dijkstra,如果跑到第一个点的数据不能更新的时候就输出 很多人不知道要跑多少次才停.其实这题因为答案要减去 T*c^2,而每条边的值 <= 1 ...
- 洛谷 P4183 - [USACO18JAN]Cow at Large P(点分治)
洛谷题面传送门 点分治 hot tea. 首先考虑什么样的点能够对以 \(u\) 为根的答案产生 \(1\) 的贡献.我们考虑以 \(u\) 为根对整棵树进行一遍 DFS.那么对于一个点 \(v\), ...
- 【G】开源的分布式部署解决方案(一) - 开篇
做这个开源项目的意义是什么?(口水自问自答,不喜可略过) 从功能上来说,请参考 预告篇,因自知当时预告片没有任何含金量,所以并没有主动推送到首页,而是私下的给一些人发的. 从个人角度上来说,我希望.n ...
随机推荐
- 如何有效地让一个“ParentFont = False”子控件使用与父母相同的字体名称?
如何有效地让一个“ParentFont = False”子控件使用与父母相同的字体名称?(How to efficiently let a `ParentFont = False` child con ...
- python315题
目录 Python基础篇 1:为什么学习Python 2:通过什么途径学习Python 3:谈谈对Python和其他语言的区别 Python的优势: 4:简述解释型和编译型编程语言 5:Python的 ...
- Go(02)windows环境搭建和vscode配置
之前讲述过linux环境下Go语言开发环境搭建,这次简述下windows的搭建以及vscode配置 windows环境搭建 同样去https://studygolang.com/dl下载windows ...
- 项目实战SportsStore——订单处理模块
前面的步骤如果顺利完成,你的网站运行之后应该能够正常显示下面三个页面: 1.产品列表 2.购物车内容页面 在某个商品后面点击“添加到购物车”则出现下图页面: 此页面上点击“继续购物”按钮则返回到产品列 ...
- Python远程连接模块-Telnet
Python远程连接模块-Telnet 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 虽然现在主流的python版本还是2.7,相信2020年python程序员都会偏向Python ...
- 网络报错:“The connection is not for this device.”
网络报错:“The connection is not for this device.” 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 记得在前几天工作的时候,有一个同时通过微信 ...
- 蓝桥杯 带分数 DFS应用
问题描述 100 可以表示为带分数的形式:100 = 3 + 69258 / 714. 还可以表示为:100 = 82 + 3546 / 197. 注意特征:带分数中,数字1~9分别出现且只出现一次( ...
- Java迭代器用法
public class Test01 { public static void main(String[] args) { List list = new ArrayList(); list.add ...
- [转载]JavaScript异步编程助手:Promise模式
http://www.csdn.net/article/2013-08-12/2816527-JavaScript-Promise http://www.cnblogs.com/hustskyking ...
- Algorithm(1) - Karatsuba multiplication
这个系列主要是记一下目前效率较高或者比较出名的一些算法. Karatsuba multiplication: x=5678 then: a=56 b=67 y=1234 c= ...