Codeforces Gym 101190M Mole Tunnels - 费用流
题目传送门
题目大意
$m$只鼹鼠有$n$个巢穴,$n - 1$条长度为$1$的通道将它们连通且第$i(i > 1)$个巢穴与第$\left\lfloor \frac{i}{2}\right\rfloor$个巢穴连通。第$i$个巢穴在最终时允许$c_i$只醒来的鼹鼠最终停留在这。已知第$i$只鼹鼠在第$p_i$个巢穴睡觉。要求求出对于每个满足$1 \leqslant k \leqslant n$的$k$,如果前$k$只鼹鼠醒来,最小的移动距离的总和。
考虑费用流的建图和暴力做法,把原图的边容量设为无限大,费用设为1(每条无向边要拆成两条),每个点再向汇点连一条边,容量为$c_i$,费用为0。
对于每次源点向$p_i$增广1单位的流量。
显然这样会超时,考虑优化费用流。
显然有:
- 每次增广的路径一定是一条简单路径
- 对于原图的一条无向边,它两个方向的边不会同时有流量(走另外一条弧的反向弧显然可以减少费用)
那么每次枚举路径的LCA,对于每个点记录一下$f_i$表示从$i$走到子树内的任意一个点的最短距离。
显然每次更新边权后很容易能够维护$f$。时间复杂度$O(n\log n)$。
Code
/**
* Codeforces
* Gym#101190M
* Accepted
* Time: 108ms
* Memory: 2200k
*/
#include <iostream>
#include <cstdlib>
#include <cstdio>
#ifndef WIN32
#define Auto "%lld"
#else
#define Auto "%I64d"
#endif
using namespace std;
typedef bool boolean; #define ll long long const signed ll llf = (signed ll) (~0ull >> );
const signed int inf = (signed) (~0u >> );
const int N = ; #define pii pair<int, int> pii operator + (pii a, int b) {
return pii(a.first + b, a.second);
} int n, m;
int w[N], c[N];
pii fd[N]; inline void init() {
scanf("%d%d", &n, &m);
for (int i = ; i <= n; i++) {
scanf("%d", c + i);
}
} int value(int p, int dir) { // up : +1, down : -1
int prod = w[p] * dir;
return (prod >= ) ? () : (-);
} void __update(int p) {
fd[p] = pii(inf * (!c[p]), p);
if ((p << ) <= n && fd[p << ].first != inf)
fd[p] = min(fd[p], fd[p << ] + value(p << , -));
if ((p << ) < n && fd[p << | ].first != inf)
fd[p] = min(fd[p], fd[p << | ] + value(p << | , -));
} int update(int s) {
int val = fd[s].first, g = s, v = fd[s].second, len = ;
for (int p = s, d = (p & ), q, cmp; len += value(p, ), p >>= ; d = p & ) {
q = p << | (d ^ );
if (q <= n && (cmp = fd[q].first + value(q, -) + len) < val)
val = cmp, g = p, v = fd[q].second;
if (c[p] && len < val)
val = len, g = v = p;
}
c[v]--;
for (int p = s; p != g; p >>= ) {
w[p]++;
__update(p);
}
for (int p = v; p != g; p >>= ) {
w[p]--;
__update(p);
}
for (int p = g; p; p >>= )
__update(p);
// cerr << s << " " << v << '\n';
return val;
} inline void solve() {
for (int i = ; i <= n; i++)
fd[i] = pii(inf * (!c[i]), i);
for (int i = n; i > ; i--)
fd[i >> ] = min(fd[i >> ], fd[i] + ); int x;
ll res = ;
while (m--) {
scanf("%d", &x);
res += update(x);
printf(Auto" ", res);
}
} int main() {
freopen("mole.in", "r", stdin);
freopen("mole.out", "w", stdout);
init();
solve();
return ;
}
Codeforces Gym 101190M Mole Tunnels - 费用流的更多相关文章
- Codeforces 362E Petya and Pipes 费用流建图
题意: 给一个网络中某些边增加容量,增加的总和最大为K,使得最大流最大. 费用流:在某条边增加单位流量的费用. 那么就可以2个点之间建2条边,第一条给定边(u,v,x,0)这条边费用为0 同时另一条边 ...
- Codeforces Gym 100203I I WIN 最大流
原题链接:http://codeforces.com/gym/100203/attachments/download/1702/statements.pdf 题解 首先寻找每个I,然后枚举形状,如果匹 ...
- CodeForces - 884F :Anti-Palindromize(贪心&费用流)
A string a of length m is called antipalindromic iff m is even, and for each i (1 ≤ i ≤ m) ai ≠ am - ...
- Codeforces Gym 100002 E "Evacuation Plan" 费用流
"Evacuation Plan" Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/10 ...
- 【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. 考虑费用流的本质,流一次需要要找一个能够从当前点到达的距离最小的点 ...
- BZOJ 4849 [NEERC2016]Mole Tunnels (模拟费用流)
题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=4849 题解 其实也是模拟费用流,但是这道题和一般的题目不一样,这道题是在一个完全二叉树上 ...
- P6122-[NEERC2016]Mole Tunnels【模拟费用流】
正题 题目链接:https://www.luogu.com.cn/problem/P6122 题目大意 给出\(n\)个点的一棵满二叉树,每个点有容量\(c_i\),\(m\)次从\(p_i\)处加一 ...
随机推荐
- C#的托管与非托管大难点
托管代码与非托管代码 众所周知,我们正常编程所用的高级语言,是无法被计算机识别的.需要先将高级语言翻译为机器语言,才能被机器理解和运行.在标准C/C++中,编译过程是这样的:源代码首先经过预处理器,对 ...
- worker pool Handling 1 Million Requests per Minute with Golang
小结: 1. 我们决定使用 Go 通道的一种常用模式构建一个两层的通道系统,一个通道用作任务队列,另一个来控制处理任务时的并发量. 这个办法是想以一种可持续的速率.并发地上传数据至 S3 存储,这样既 ...
- [daily][archlinux] TODO LIST
reminder: https://wikemacs.org/wiki/Buffer_management TO READ: https://www.kernel.org/doc/htmldocs/k ...
- delphi 自动获取串口
delphi 自动获取串口 https://blog.csdn.net/Nevermore_anger/article/details/79012875 版权声明:本文为博主原创文章,未经博 ...
- python-装饰器实现pv-uv
python-装饰器实现pv-uv 网站流量统计可以帮助我们分析网站的访问和广告来访等数据,里面包含很多数据的,比如访问试用的系统,浏览器,ip归属地,访问时间,搜索引擎来源,广告效果等.原来是一 ...
- 你应当如何学习C++以及编程(细节是必要的,但不是重要的,把时间用在集中精力去解决问题,而不是学习新技术,那样练不成高手。在实践中提高才是最重要的。最最重要的内功还是长期学习所磨练出来的自学能力)good
最近在学习Qt但由于没有C++的基础,感觉学的很吃力.看到pongba的这篇文章感觉不错就弄过来了, 原文地址:http://blog.csdn.net/qter_wd007/article/deta ...
- Java面试题和解答(三)
1.这段代码大多数情况下运行正常,但是某些情况下会出问题.什么时候会出现什么问题?如何修正? public class MyStack { private List<String> lis ...
- 二维码图片以字符串的形式保存DB,已文件流显示页面上
以下是生成二维码的方法,我只用其中一个方法 这个需要引用ZXing.DLL 链接:https://pan.baidu.com/s/1mCTwHiAm_awtsPcibAotZw 提取码:ufp6 pu ...
- 统计Oracle一个表空间中各个segment占用的空间大小
SQL语句参考以下: select owner,segment_name,segment_type,tablespace_name,sum(bytes)/1024/1024/1024 from dba ...
- Excel坐标自动在AutoCad绘图_6
众所周知,Excel对数据处理的功能非常强大,它可以进行数据处理.统计分析已经辅助决策的操作,该软件已经渗透到各个领域.作为一个测绘人,GISer, 也经常利用excel完成一些测量表格的自动化计算, ...