BZOJ 4849 [NEERC2016]Mole Tunnels (模拟费用流)
题目链接
https://www.lydsy.com/JudgeOnline/problem.php?id=4849
题解
其实也是模拟费用流,但是这道题和一般的题目不一样,这道题是在一个完全二叉树上
这意味着我们根本不需要考虑什么类似数轴上老鼠进洞之类的做法,我们跑费用流,每次选一条最短路增广即可
然后增广之后最短路上的点费用会由\(1\)变成\(-1\), 直接在完全二叉树上暴力修改暴力维护子树内最近的食物点即可
说白了就是暴力,但是复杂度\(O(n\log n)\).
代码
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cassert>
#include<iostream>
using namespace std;
inline int read()
{
int x=0; bool f=1; char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=0;
for(; isdigit(c);c=getchar()) x=(x<<3)+(x<<1)+(c^'0');
if(f) return x;
return -x;
}
const int N = 1e5;
const int INF = 1e8;
struct Element
{
int x,pos;
Element() {}
Element(int _x,int _pos) {x = _x,pos = _pos;}
};
void update(Element &x,Element y) {if(y.x<x.x) x = y;}
Element dp[N+3];
int w[N+3];
int pos[N+3];
int dep[N+3];
int c[N+3];
int n,m;
int LCA(int u,int v)
{
while(u!=v)
{
if(u>v) u>>=1;
else v>>=1;
}
return u;
}
void pushup(int u)
{
if(w[u]>0) {dp[u] = Element(0,u);}
else {dp[u] = Element(INF,0);}
if((u<<1)<=n) {update(dp[u],Element(dp[u<<1].x+(c[u<<1]<0?-1:1),dp[u<<1].pos));}
if((u<<1|1)<=n) {update(dp[u],Element(dp[u<<1|1].x+(c[u<<1|1]<0?-1:1),dp[u<<1|1].pos));}
// printf("pushup dp[%d]=(%d,%d)\n",u,dp[u].x,dp[u].pos);
}
Element query(int u)
{
Element ret(INF,0); int tmp = 0;
while(u)
{
update(ret,Element(dp[u].x+tmp,dp[u].pos));
tmp += c[u]>0?-1:1;
u>>=1;
}
return ret;
}
void addval(int u,int v,int x)
{
while(u!=v)
{
c[u] += x;
pushup(u>>1);
u>>=1;
}
while(u>0)
{
pushup(u);
u>>=1;
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++) scanf("%d",&w[i]);
for(int i=1; i<=m; i++) scanf("%d",&pos[i]);
dep[1] = 1; for(int i=2; i<=n; i++) dep[i] = dep[i>>1]+1;
for(int i=n; i>=1; i--) pushup(i);
int ans = 0;
for(int i=1; i<=m; i++)
{
int u = pos[i];
Element tmp = query(u);
ans += tmp.x; int v = tmp.pos,lca = LCA(u,v);
w[v]--; pushup(v);
addval(u,lca,-1);
addval(v,lca,1);
printf("%d ",ans);
}
return 0;
}
BZOJ 4849 [NEERC2016]Mole Tunnels (模拟费用流)的更多相关文章
- 【BZOJ4849】[Neerc2016]Mole Tunnels 模拟费用流
[BZOJ4849][Neerc2016]Mole Tunnels Description 鼹鼠们在底下开凿了n个洞,由n-1条隧道连接,对于任意的i>1,第i个洞都会和第i/2(取下整)个洞间 ...
- BZOJ4849[Neerc2016]Mole Tunnels——模拟费用流+树形DP
题目描述 鼹鼠们在底下开凿了n个洞,由n-1条隧道连接,对于任意的i>1,第i个洞都会和第i/2(取下整)个洞间有一条隧 道,第i个洞内还有ci个食物能供最多ci只鼹鼠吃.一共有m只鼹鼠,第i只 ...
- bzoj 4849: [Neerc2016]Mole Tunnels【模拟费用流】
参考:https://www.cnblogs.com/CQzhangyu/p/6952371.html 费用流很简单,考虑但是会T. 考虑费用流的本质,流一次需要要找一个能够从当前点到达的距离最小的点 ...
- P6122-[NEERC2016]Mole Tunnels【模拟费用流】
正题 题目链接:https://www.luogu.com.cn/problem/P6122 题目大意 给出\(n\)个点的一棵满二叉树,每个点有容量\(c_i\),\(m\)次从\(p_i\)处加一 ...
- BZOJ 1920 Luogu P4217 [CTSC2010]产品销售 (模拟费用流、线段树)
题目链接 (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=1920 (luogu) https://www.luogu.org/prob ...
- BZOJ 5326 [JSOI2017]博弈 (模拟费用流、线段树)
题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=5326 题解 终于成为第8个A掉这题的人--orz tzw神仙早我6小时 本以为这东西常数 ...
- BZOJ 3836 Codeforces 280D k-Maximum Subsequence Sum (模拟费用流、线段树)
题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=3836 (Codeforces) http://codeforces.com ...
- 贪心(模拟费用流):NOIP2011 观光公交
[问题描述] 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第0 分钟出现在1号景点,随后依次前往2. ...
- BZOJ4977[Lydsy1708月赛]跳伞求生——贪心+堆+模拟费用流
题目链接: 跳伞求生 可以将题目转化成数轴上有$n$个人和$m$个房子,坐标分别为$a_{i}$和$b_{i}$,每个人可以进一个他左边的房子,每个房子只能进一个人.每个房子有一个收益$c_{i}$, ...
随机推荐
- # ACM奇淫技巧
目录 ACM奇淫技巧 差分操作 坐标旋转 ACM 卡常优化 vsc代码块(头文件模板) 读入输出优化 逗号表达式 内联函数inline 寄存器变量register 条件判断加减代替取模 自增运算符优化 ...
- layui2.5 修改layuicms
雷哥layui2.5版本学习 学习地址: https://www.bilibili.com/video/av59813890/?p=30 注意: 修改layuicms时注意下面是缓存的js, < ...
- 测试必知150个常用Linux命令,已为各位筛选整理
●线上查询及帮助命令(1 个) help 如:mkdir --help ●文件和目录操作命令(12 个) ls tree pwd mkdir rmdir cd touch cp mv r ...
- java之设计模式汇总
1.单例模式 就是一个类只产生一个对象 对应数据库连接 定时执行者服务(ScheduledExecutorService) 在整个项目中应该只有一个对象 2.工厂模式 定义一个用于创建对象的接口 让子 ...
- qt treaview项checkbox样式
QTreeView::indicator:enabled:checked { /** 指示器 - 选中 **/ image: url(yzfx/checkbox_checked.png);}QTree ...
- JavaScript制作九九乘法表
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Python 第一个程序
第一个程序 打开pycharm,新建一个工程,新建一个文件(后缀为.py) 书写最简单的代码:print(人生苦短,我用python!) 执行python代码 使用pycharm的运行按钮 终端下输入 ...
- OpenSSL(2)创建私有证书颁发机构
如果想要建立自己的CA, OpenSSL已经包含了所有你需要的东西.所有的操作都通过纯命令行执行,虽然不那么友好,整个过程也比较长,但是这可以让你去思考每个细节. 我建议自己创建一套私有的 CA主要是 ...
- Tomcat配置JNDI
JNDI是什么?使用JNDI有什么好处? JNDI是 Java 命名与目录接口(Java Naming and Directory Interface),在J2EE规范中是重要的规范之一. 我个人对j ...
- linux使用VNC服务轻松远程安装oracle
VNC服务在远程服务器上安装oracle,新手安装oracle时总会遇到这样或者那样的问题,下面我就详细解说一下安装过程,其实oracle安装很简单,并不要把他相像的特别复杂. 本环境用:centos ...