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}$, ...
 
随机推荐
- Django基础之模型层(下)
			
聚合查询 关键字:aggregate from django.db.models import Max,Min,Sum,Count,Avg 统计所有书的平均价格 models.Book.objects ...
 - jQuery可拖拽旋转的3D图片墙
			
在线演示 本地下载
 - PageObject 页面对象模式
			
一.PageObject 页面对象设计模式 (一个页面建一个类,即对象,页面对象) 每个页面都建对应的class,类中包含了页面的输入框.标题.元素等元素,测试代码中测试这个页面时,只需要调用这个页 ...
 - C语言函数调用时候内存中栈的动态变化详细分析(彩图)
			
版权声明:本文为博主原创文章,未经博主允许不得转载.欢迎联系我qq2488890051 https://blog.csdn.net/kangkanglhb88008/article/details/8 ...
 - python:split()函数
			
描述 Python 内置函数 指定分隔符对字符串进行切片 如果参数 num 有指定值,则仅分隔 num 个子字符串 返回分割后的字符串列表. 语法 str.split(str="" ...
 - 26 Python模块之paramiko
			
paramiko模块提供了ssh及sft进行远程登录服务器执行命令和上传下载文件的功能.这是一个第三方的软件包,使用之前需要安装. 1. 基于用户名和密码的sshclient方式登录 #创建一个ssh ...
 - 怎么定义vue-router的动态路由?怎么获取传过来的动态参数?
			
在router目录下的index.js文件中,对path属性加上/:id. 使用router对象的params.id 例如 : this.$route.params.id
 - elasticsearch设置执行脚本并添加开机启动 (转)
			
elasticsearch设置执行脚本并添加开机启动 在/etc/init.d目录下新建文件elasticsearch #!/bin/sh #chkconfig: 2345 80 05 #descri ...
 - 深入理解并使用python的模块与包
			
模块 编写好的一个python文件可以有两种用途:1)脚本,一个文件就是整个程序,用来被执行2)模块,文件中存放着一堆功能,用来被导入使用 模块的分类 1)开发者编写的 .py文件2 ) 由C或C++ ...
 - docker_facenet_image在Docker容器中运行Facenet环境搭建
			
对开发和运维人员来说,可能最梦寐以求的就是一次性地创建或配置,可以在任意环境.任意时间让应用正常运行.而Docker恰恰是可以实现这一终极目标的瑞士军刀. 具体来说,Docker在开发和运维过程中,具 ...