题目大意:
  给定一棵$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 ;
}

最新文章

  1. MFC AfxMessageBox默认标题修改
  2. 后端Java工程师常用JavaScript_DOM
  3. 利用spring boot创建java app
  4. scp详解
  5. JS Replace() 全部替换字符的用法
  6. js学习笔记7----return,arguments及获取元素样式
  7. 9.27js拓展、bootstrap菜鸟教程
  8. 利用Sonar规则结合WebStorm进行Code Inspect
  9. 降龙十八掌之一:(亢龙有悔)SQL Server Profiler和数据库引擎优化顾问
  10. 去除UITableView中多余的分割线或者隐藏cell间的分割线
  11. Android 反编译apk 详解
  12. Js的引用赋值与传值赋值
  13. 一个.net程序员教你使用less
  14. NSS_05 数据访问选型
  15. IT版孔乙己(转)
  16. [Quick-x]移动CCEditbox的父对象导致输入框位置偏移问题
  17. discuz 和 wordpress 整合注意问题
  18. 【转】.net IL 指令解释速查
  19. String类的一些转换功能(6)
  20. logback root level logger level 日志级别覆盖?继承?

热门文章

  1. Pytest框架介绍
  2. springboot整合jersey
  3. Oracle 学习----:查看当前时间与Sqlserver语句不一样了
  4. css:hover状态改变另一个元素样式的使用
  5. python学习总结---函数使用 and 生成器
  6. 替换localhost:8080(假域名,本地使用)
  7. 【bzoj4146】[AMPPZ2014]Divisors 数论
  8. APIO2017游记
  9. php的post
  10. 7月12号day4总结