[POI2014]Ant colony
题目大意:
给定一棵$n(n\le10^6)$个结点的树。在每个叶子结点,有$g$群蚂蚁要从外面进来,其中第$i$群有$m_i$只蚂蚁。这些蚂蚁依次爬树(一群蚂蚁爬完后才会爬另一群),若当前经过结点度为$d+1$,蚂蚁数量为$m$,则接下来没走过的$d$个方向,每个方向爬$\lfloor\frac md\rfloor$只蚂蚁,剩下蚂蚁消失。在给定的一条边上有一只食蚁兽,若当前经过这条边的蚂蚁数量为$k$,则吃掉这些蚂蚁。问最后能吃到多少蚂蚁?
思路:
从给定边出发BFS,算出每条边会被吃掉的蚁群规模的上界和下界。若到了叶子节点,就在$\{m_i\}$中二分。然后洛谷和SZKOpuł上都能随便AC,BZOJ大力卡一波常才过。
#include<cstdio>
#include<algorithm>
#include<sys/mman.h>
#include<sys/stat.h>
typedef long long int64;
class BufferedInputStream {
private:
char *buf,*p;
int size;
public:
BufferedInputStream() {
register int fd=fileno(stdin);
struct stat sb;
fstat(fd,&sb);
size=sb.st_size;
p=buf=reinterpret_cast<char*>(mmap(,size,PROT_READ,MAP_PRIVATE,fileno(stdin),));
}
char getchar() {
return (p==buf+size||*p==EOF)?EOF:*p++;
}
};
BufferedInputStream in;
inline int getint() {
register char ch;
while(!__builtin_isdigit(ch=in.getchar()));
register int x=ch^'';
while(__builtin_isdigit(ch=in.getchar())) x=(((x<<)+x)<<)+(ch^'');
return x;
}
const int N=1e6+;
bool vis[N];
int deg[N],q[N],head,tail,h[N],sz;
int64 m[N],max[N],min[N];
struct Edge {
int to,next;
};
Edge e[N<<];
inline void add_edge(const int &u,const int &v) {
e[++sz]=(Edge){v,h[u]};h[u]=sz;deg[u]++;
e[++sz]=(Edge){u,h[v]};h[v]=sz;deg[v]++;
}
int main() {
const int n=getint(),g=getint(),k=getint();
int64 lim=;
for(register int i=;i<=g;i++) {
lim=std::max(lim,m[i]=getint());
}
std::sort(&m[],&m[g]+);
for(register int i=;i<n;i++) {
const int u=getint(),v=getint();
if(i==) {
max[u]=min[u]=max[v]=min[v]=k;
vis[u]=vis[v]=true;
q[tail++]=u;
q[tail++]=v;
}
add_edge(u,v);
}
int64 ans=;
while(head<tail) {
const int &x=q[head++];
if(deg[x]==) {
ans+=(int64)(std::upper_bound(&m[],&m[g]+,max[x])-std::lower_bound(&m[],&m[g]+,min[x]))*k;
}
for(register int i=h[x];i;i=e[i].next) {
const int &y=e[i].to;
if(vis[y]) continue;
max[y]=std::min((max[x]+)*(deg[x]-)-,lim);
min[y]=min[x]*(deg[x]-);
vis[y]=true;
if(min[y]<=lim) q[tail++]=y;
}
}
__builtin_printf("%lld\n",ans);
return ;
}
[POI2014]Ant colony的更多相关文章
- [BZOJ3872][Poi2014]Ant colony
[BZOJ3872][Poi2014]Ant colony 试题描述 There is an entrance to the ant hill in every chamber with only o ...
- bzoj 3872: [Poi2014]Ant colony -- 树形dp+二分
3872: [Poi2014]Ant colony Time Limit: 30 Sec Memory Limit: 128 MB Description There is an entranc ...
- 【BZOJ3872】[Poi2014]Ant colony 树形DP+二分
[BZOJ3872][Poi2014]Ant colony Description 给定一棵有n个节点的树.在每个叶子节点,有g群蚂蚁要从外面进来,其中第i群有m[i]只蚂蚁.这些蚂蚁会相继进入树中, ...
- bzoj 3872 [Poi2014]Ant colony——二分答案
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3872 可以倒推出每个叶子节点可以接受的值域.然后每个叶子二分有多少个区间符合即可. 注意一开 ...
- bzoj 3872: [Poi2014]Ant colony【树形dp+二分】
啊我把分子分母混了WA了好几次-- 就是从食蚁兽在的边段成两棵树,然后dp下去可取的蚂蚁数量区间,也就是每次转移是l[e[i].to]=l[u](d[u]-1),r[e[i].to]=(r[u]+1) ...
- $bzoj3872\ [Poi2014]\ Ant\ colony$ 二分+$dp$
正解:二分+$dp$ 解题报告: 传送门$QwQ$ 一年过去了依然没有头绪,,,$gql$的$NOIp$必将惨败了$kk$. 考虑倒推,因为知道知道除数和答案,所以可以推出被除数的范围,然后一路推到叶 ...
- Luogu3576 POI2014 MRO-Ant colony 【树形DP】*
Luogu3576 POI2014 MRO-Ant colony The ants are scavenging an abandoned ant hill in search of food. Th ...
- 洛谷——P3576 [POI2014]MRO-Ant colony
P3576 [POI2014]MRO-Ant colony 题目描述 The ants are scavenging an abandoned ant hill in search of food. ...
- [bzoj3872][Poi2014]Ant colony_树形dp
Ant colony bzoj-3872 Poi-2014 题目大意:说不明白.....题目链接 注释:略. 想法:两个思路都行. 反正我们就是要求出每个叶子节点到根节点的每个路径权值积. 可以将边做 ...
随机推荐
- 孤荷凌寒自学python第五天初识python的列表
孤荷凌寒自学python第五天 列表 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 粗俗地区分列表,可以这样理解,定义或print列表后显示时,列表中的各元素都是用一个方括号[]括起来的. ...
- [OpeCV] highgui头文件
通过HighGUI(high-level graphical user interface)可以实现打开窗口.显示图像.读出和写入图像文件,处理鼠标.光标.键盘事件. 而HighGUI主要分成“视频输 ...
- 一些优秀的SLAM博主
http://blog.csdn.net/u010566411 http://blog.csdn.net/qq_18661939/article/details/51782376 http://www ...
- nyoj 题目44 子串和
子串和 时间限制:5000 ms | 内存限制:65535 KB 难度:3 描述 给定一整型数列{a1,a2...,an},找出连续非空子串{ax,ax+1,...,ay},使得该子序列的和最 ...
- 0-1背包问题(经典)HDU2602 Bone Collector
Bone Collector Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- 石子归并的三种打开方式——难度递增———51Node
1021 石子归并 N堆石子摆成一条线.现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的代价.计算将N堆石子合并成一堆的最小代价. ...
- 管理页面的类 PageHelper
using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Da ...
- 简单粗暴!解决锐捷强制关闭VMware NAT Service的问题(图文教程)
众所周知毒瘤的锐捷会定时强制关闭NAT服务,导致虚拟机连不上网,进而你的虚拟机就成了孤儿,只能玩单机. 在一番百度后,得到了一种神仙破解办法.原理是把锐捷关闭服务时所用的搜索关键字改掉,这样锐捷就搜不 ...
- 【Git】GitHub的SSH提交配置[
Git可以通过https方式和ssh方式连接服务器上的仓库. 两者比较: 1.https: 比较方便,但是每次fetch和push代码都需要输入账号和密码,略显麻烦 2.ssh: 传输前压缩数据,传输 ...
- Relation(NOIP模拟赛)(二分图染色)
原题: Description 有n个人,编号为1àn,告诉你那些人之间是不友好的.现在,让你将这n个人分成两组,使得每一组之内的人是互相友好的,如果可以分成两组,则输出如何分组的,如果不可以分成两组 ...