思路是覆盖子树,我们发现,农民想截住牛的最优策略是不断向上来尽可能地覆盖更大的子树

我们想要尽早地覆盖一个子树,一个显然的贪心是在这个子树中选取深度最小的一个放农民

如果我们在一个点放置了农民,那么其他点也会被覆盖,所有这个农民能够覆盖的叶子都不需要再放农民了

抽象出来,对于每个叶节点,都有一个深度,我们把叶节点按深度排序,然后每次选取深度最浅的点打标记,然后枚举每个点,把这个点能覆盖的点全部删去

那么我们怎样支持这样一种操作呢,我们可以用一个$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】的更多相关文章

  1. [USACO18JAN]Cow at Large G(树形DP)

    P4186 [USACO18JAN]Cow at Large G(树形DP) Luogu4186 设dp[i]表示i点需要放多少个农民.则有 \(if(near[i]-dep[i]<=dep[i ...

  2. [USACO18JAN] Cow at Large G (dfs)

    题目大意:有一只狐狸从给定的S点开始逃跑(出发),向叶节点移动以逃离这棵树,叶节点可能出现农民去抓捕狐狸,当农民和狐狸出现在同一个节点的时候,狐狸会被抓住,农民和狐狸移动速度相同,求抓捕狐狸所需要的最 ...

  3. [洛谷P4183][USACO18JAN]Cow at Large P

    题目链接 Bzoj崩了之后在洛谷偶然找到的点分好题! 在暴力的角度来说,如果我们$O(n)$枚举根节点,有没有办法在$O(n)$的时间内找到答案呢? 此时如果用树形$dp$的想法,发现是可做的,因为可 ...

  4. 【Heaven Cow与God Bull】题解

    题目 Description __int64 ago,there's a heaven cow called sjy... A god bull named wzc fell in love with ...

  5. luogu P4183 [USACO18JAN]Cow at Large P

    传送门 首先考虑N^2做法,每次从一个点出发,如果到达一个点,然后到达这个点的时间\(\le\)离这个点最近的叶子距离\(di_x\),那么答案+1,否则继续找点 这个暴力很不好优化.可以这样认为,如 ...

  6. [USACO18JAN]Cow at Large P

    Description: 贝茜被农民们逼进了一个偏僻的农场.农场可视为一棵有 \(N\) 个结点的树,结点分别编号为 \(1,2,\ldots, N\) .每个叶子结点都是出入口.开始时,每个出入口都 ...

  7. 题解 P6005 【[USACO20JAN]Time is Mooney G】

    抢第一篇题解 这题的思路其实就是一个非常简单的dijkstra,如果跑到第一个点的数据不能更新的时候就输出 很多人不知道要跑多少次才停.其实这题因为答案要减去 T*c^2,而每条边的值 <= 1 ...

  8. 洛谷 P4183 - [USACO18JAN]Cow at Large P(点分治)

    洛谷题面传送门 点分治 hot tea. 首先考虑什么样的点能够对以 \(u\) 为根的答案产生 \(1\) 的贡献.我们考虑以 \(u\) 为根对整棵树进行一遍 DFS.那么对于一个点 \(v\), ...

  9. 【G】开源的分布式部署解决方案(一) - 开篇

    做这个开源项目的意义是什么?(口水自问自答,不喜可略过) 从功能上来说,请参考 预告篇,因自知当时预告片没有任何含金量,所以并没有主动推送到首页,而是私下的给一些人发的. 从个人角度上来说,我希望.n ...

随机推荐

  1. DataSet和实体类的相互转换

    最近做WInfrom项目,对表格和控件的数据绑定非常喜欢用实体类对象来解决,但是绑定以后 又怎么从控件中拿到实体类或者转换为datatable 或者dataset呢 经过在网上的搜索以及自己的改进 完 ...

  2. MT【203】连续型的最值

    (北大自招)已知$-6\le x_i\le 10 (i=1,2,\cdots,10),\sum\limits_{i=1}^{10}x_i=50,$当$\sum\limits_{i=1}^{10}x^2 ...

  3. [JZOJ 5402] God Knows

    终于搞完了这乡里别题目 $ $ 考虑一个 \(dp\) ,设 \(f[i]\) 表示最后一个匹配选 \((i,p[i])\) 的最小费用 首先我们考虑答案长什么样 假设根据 \(p[i]\) 排序 , ...

  4. BZOJ 3625: [Codeforces Round #250]小朋友和二叉树

    3625: [Codeforces Round #250]小朋友和二叉树 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 304  Solved: 13 ...

  5. 关于找List的中间Node

    初始值 slow = fast = head; 如果使用 fast && fast->next && fast->next->next 作为快慢指针循 ...

  6. tomcat 性能调优

    1. 内存 windows在bin/catalina.bat的注释下第一行加入 set JAVA_OPTS=-Xms2048m -Xmx2048m -Xss128K -XX:PermSize=64m ...

  7. bug5 Debug:This kind of launch is configured to openthe debug perspective when it解决办法

    启动tomcat时,myeclipse报错: This kind of launch is configured to openthe debug perspective when itsuspend ...

  8. HDU 6158 笛卡尔定理+韦达定理

    The Designer Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  9. adb logcat介绍

    logcat命令语法: [adb] logcat [<option>] ... [<filter-spec>] ... adb logcat -c 清除所有以前的日志 adb ...

  10. git 创建空提交

    git commit --allow-empty -m "Empty Commit to setup deployments"