「6月雅礼集训 2017 Day2」C
【题目大意】
有一棵n个点的完全二叉树,边权均为1,每个点有小鸟容量c[i]
依次来了m只小鸟,第i只小鸟初始位置在pos[i]上,问来了x只小鸟的时候,怎样安排小鸟的路线可以使得小鸟移动的边权和最小,且每个点的小鸟个数不超过小鸟容量。
n,m<=3*10^5
【题解】
一眼看过去费用流
有两种方法
1. 我们对每次来小鸟都新建二分图,S->小鸟容量剩余的点,小鸟容量不够的点->T,互相连边即可。
复杂度O(n^3 + n * MinCostFlow)
2. 我们对于整棵树建一张图,每次相当于多连了一条边,跑一边spfa增广即可。
复杂度O(n * MinCostFlow)
考场写第一种啊。。qwq
那么考虑第二种,我们模拟spfa的增广过程,显然是选一条最短路来增广。
由于完全二叉树,树高log,我们可以枚举这只小鸟要迁到的点和pos的LCA,然后顺便维护子树内到这个点的最小值即可。
每次选出一条路,就把这条路上模拟退流、流边、流反向边等等操作
然后就能过了,由于完全二叉树,操作都是log的。
总复杂度O(nlogn)
# include <stdio.h>
# include <string.h>
# include <iostream>
# include <algorithm> using namespace std; typedef long long ll;
typedef unsigned long long ull;
typedef long double ld; # define RG register
# define ST static const int M = 3e5 + ;
const int mod = , inf = 1e9; int n, m, d[M], id[M], f[M][], c[M]; # define ls (x<<)
# define rs (x<<|) inline void gs(int x) {
d[x] = inf;
if(c[x]) d[x] = , id[x] = x;
if(ls <= n && d[ls] + (f[ls][] ? - : ) < d[x]) d[x] = d[ls] + (f[ls][] ? - : ), id[x] = id[ls];
if(rs <= n && d[rs] + (f[rs][] ? - : ) < d[x]) d[x] = d[rs] + (f[rs][] ? - : ), id[x] = id[rs];
} int main() {
// freopen("C.in", "r", stdin);
// freopen("C.out", "w", stdout);
cin >> n >> m;
for (int i=; i<=n; ++i) scanf("%d", &c[i]);
for (int i=n; i; --i) gs(i);
ll ans = ;
for (int i=, x; i<=m; ++i) {
scanf("%d", &x);
int cnt = , pmi = inf, pid = ;
for (int par=x; par; par>>=) {
if(d[par] + cnt < pmi) pmi = d[par] + cnt, pid = par;
cnt += (f[par][] ? - : );
}
ans += pmi;
// cout << "pid = " << pid << " pmi = " << pmi << ", id = " << id[pid] << endl;
c[id[pid]] --;
for (int y=id[pid]; y!=pid; y>>=) if(f[y][]) --f[y][]; else ++f[y][];
for (int y=x; y!=pid; y>>=) if(f[y][]) --f[y][]; else ++f[y][];
for (int y=id[pid]; y!=pid; y>>=) gs(y);
for (int y=x; y!=pid; y>>=) gs(y);
for (int y=pid; y; y>>=) gs(y);
printf("%lld\n", ans);
}
return ;
}
「6月雅礼集训 2017 Day2」C的更多相关文章
- 「6月雅礼集训 2017 Day2」B
[题目大意] 求n*n的棋盘,每行每列都有2个黑格子的方案数. n<=10^7 [题解] zzq的做法好神奇啊 行列建点,二分图 左边有i个点,右边有j个点的方案数 f[i,j] 左边有i个点, ...
- 「6月雅礼集训 2017 Day2」A
[题目大意] 给出一棵树,求有多少对点(u,v)满足其路径上不存在两个点a,b满足(a,b)=1 n<=10^5 [题解] 考虑找出所有不符合的点对,共有n*ln(n)对,他们要么是祖先-> ...
- 「6月雅礼集训 2017 Day10」quote
[题目大意] 一个合法的引号序列是空串:如果引号序列合法,那么在两边加上同一个引号也合法:或是把两个合法的引号序列拼起来也是合法的. 求长度为$n$,字符集大小为$k$的合法引号序列的个数.多组数据. ...
- 「6月雅礼集训 2017 Day4」qyh(bzoj2687 交与并)
原题传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2687 [题目大意] 给出若干区间,求一个区间的大于等于2的子集,使得 |区间并| 和 | ...
- 「6月雅礼集训 2017 Day11」delight
[题目大意] 有$n$天,每天能吃饭.睡觉.什么事也不干 每天吃饭的愉悦值为$e_i$,睡觉的愉悦值为$s_i$,什么都不干愉悦值为0. 要求每连续$k$天都要有至少$E$天吃饭,$S$天睡觉. 求最 ...
- 「6月雅礼集训 2017 Day11」jump
[题目大意] 有$n$个位置,每个位置有一个数$x_i$,代表从$i$经过1步可以到达的点在$[\max(1, i-x_i), \min(i+x_i, n)]$中. 定义$(i,j)$的距离表示从$i ...
- 「6月雅礼集训 2017 Day11」tree
[题目大意] 给出一棵带权树,有两类点,一类黑点,一类白点. 求切断黑点和白点间路径的最小代价. $n \leq 10^5$ [题解] 直接最小割能过..但是树形dp明显更好写 设$f_{x,0/1/ ...
- 「6月雅礼集训 2017 Day10」perm(CodeForces 698F)
[题目大意] 给出一个$n$个数的序列$\{a_n\}$,其中有些地方的数为0,要求你把这个序列填成一个1到$n$的排列,使得: $(a_i, a_j) = 1$,当且仅当$(i, j) = 1$.多 ...
- 「6月雅礼集训 2017 Day8」route
[题目大意] 给出平面上$n$个点,求一条连接$n$个点的不相交的路径,使得转换的方向符合所给长度为$n-2$的字符串. $n \leq 5000$ [题解] 考虑取凸包上一点,然后如果下一个是‘R' ...
随机推荐
- LINUX目录的意思
Linux系统/目录下的文件夹里面分别是以下内容: /usr 包含所有的命令和程序库.文档和其他文件,还包括当前linux发行版的主要应用程序 /var 包含正在操作的文件,还有记录文件.加密文件.临 ...
- jar命令:打包、查看、更新等
如何把写好的Java程序打包为jar文件呢?下面说的就是java使用命令行打包JAR的方法 1.命令行的方式:打包jar cf JAR文件名称 程序文件名称或者程序所在的文件夹举例:jar cf My ...
- .netcore centos环境搭建实战
步骤 1. 安装VMware Workstation 下载地址:https://my.vmware.com/cn/web/vmware/info/slug/desktop_end_user_compu ...
- Centos6 使用yum快速搭建LAMP环境
1.安装Apache [root@localhost ~]# yum -y install httpd # 开机自启动 [root@localhost ~]# chkconfig httpd on ...
- centos7用yum搭建LAMP环境
用yum快速搭建LAMP平台 实验环境: [root@nmserver- html]# cat /etc/redhat-release CentOS release (AltArch) [root@n ...
- Python 3基础教程25-异常处理
在Python中,异常处理,主要是try except语句,通常语法格式如下. try: 代码块1 except Exception as e: print(e) 代码2 接着前面读取CSV文件,如果 ...
- jmeter的基本使用过程
jmeter的基本使用过程 接下来几周,我将通过视频的方式,录制下来jmeter的基本用法,方便大家参考学习 可能导图会随时调整
- C# 结构类型与类的区别
结构类型是值类型:类是引用类型: 内存位置不同,结构类型在应用程序的堆栈中:类对象在托管中: 是否改变源对象
- nopcommerce商城系统--安装nopCommerce
原址:http://www.nopcommerce.com/docs/79/installing-nopcommerce.aspx .NET Framework 4.5.1下载:http://www. ...
- D - 小木棒
D - 小木棒 Time Limit: 1000/1000MS (C++/Others) Memory Limit: 65536/65536KB (C++/Others) Problem Descri ...