博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[bzoj4849][Neerc2016]Mole Tunnels
阅读量:4670 次
发布时间:2019-06-09

本文共 1498 字,大约阅读时间需要 4 分钟。

来自FallDream的博客,未经允许,请勿转载,谢谢


貌似是省队集训女队讲的题。。。

今天在bzoj找一道题无果,但是翻到了这道就顺便写了下。

 

鼹鼠们在底下开凿了n个洞,由n-1条隧道连接,对于任意的i>1,第i个洞都会和第i/2(取下整)个洞间有一条隧道,第i个洞内还有ci个食物能供最多ci只鼹鼠吃。一共有m只鼹鼠,第i只鼹鼠住在第pi个洞内,一天早晨,前k只鼹鼠醒来了,而后n-k只鼹鼠均在睡觉,前k只鼹鼠就开始觅食,最终他们都会到达某一个洞,使得所有洞的ci均大于等于该洞内醒着的鼹鼠个数,而且要求鼹鼠行动路径总长度最小。现对于所有的1<=k<=m,输出最小的鼹鼠行动路径的总长度,保证一定存在某种合法方案。
n<=10^5
 
看出是完全二叉树上费用流  建图比较简单 但是并不能过
发现树高是log级别的,所以考虑直接手动模拟。
f[x]表示从x走到子树中的一个可以觅食的点的最短距离,顺便记一下是哪个点。
一条边记一下它的正向通过次数和反向通过次数,如果他们相同那么两条边的距离都是1,不然有一个方向会因为反向边而变成-1
然后直接枚举lca更新答案,并且更新通过次数和f数组即可。
复杂度nlogn
#include
#include
#include
#include
#define MN 100000using namespace std;inline int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){
if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f;}int n,m,p[MN+5],tms[MN+5],f[MN+5],From[MN+5],ans=0;inline int GetU(int x){
return tms[x]<=0?1:-1;}inline int GetD(int x){
return tms[x]>=0?1:-1;}void update(int x){ int l=x<<1,r=x<<1|1; if(p[x]) f[x]=0,From[x]=x; else { f[x]=1e9,From[x]=0; if(l<=n&&f[l]+GetD(l)
1;t>>=1) if(f[t>>1]+(d+=GetU(t))
>1]+d,Best=t>>1; printf("%d ",ans+=mn);--p[From[Best]]; for(int i=From[Best];i>Best;i>>=1) ++tms[i],update(i); for(int i=x;i>Best;i>>=1) --tms[i],update(i); for(int i=Best;i;i>>=1) update(i); } return 0;}

 

转载于:https://www.cnblogs.com/FallDream/p/bzoj4849.html

你可能感兴趣的文章
Personal Leetcode solution(Python) 1~20
查看>>
延时器弹窗
查看>>
5.1什么是视图
查看>>
WWDC 2015大会到来了
查看>>
JSP 入门 HTML嵌套Java脚步 显示时间
查看>>
【自爆系列】如何从整体上削弱一支队伍的技术水平
查看>>
MySQL实习训练1
查看>>
HDU 1166 敌兵布阵 【线段树-点修改--计算区间和】
查看>>
Hashtable几种常用的遍历方法
查看>>
hadoop 3.0.0 alpha3 安装、配置
查看>>
在Windows Server通过MMC导入客户证书的注意事项
查看>>
设计模式之“单例模式”
查看>>
iOS App上架流程(2016详细版)
查看>>
SpringMVC+Thymeleaf +HTML的简单框架
查看>>
mxnet系列 安装
查看>>
Flask - 基础
查看>>
导航栏主题
查看>>
堆排序
查看>>
Expm 1_2 实现快速排序的算法,并尝试采用不同的方法实现线性的划分过程.
查看>>
Spoon新建repository的时候
查看>>