【题目大意】

有一棵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)

  1. # include <stdio.h>
  2. # include <string.h>
  3. # include <iostream>
  4. # include <algorithm>
  5.  
  6. using namespace std;
  7.  
  8. typedef long long ll;
  9. typedef unsigned long long ull;
  10. typedef long double ld;
  11.  
  12. # define RG register
  13. # define ST static
  14.  
  15. const int M = 3e5 + ;
  16. const int mod = , inf = 1e9;
  17.  
  18. int n, m, d[M], id[M], f[M][], c[M];
  19.  
  20. # define ls (x<<)
  21. # define rs (x<<|)
  22.  
  23. inline void gs(int x) {
  24. d[x] = inf;
  25. if(c[x]) d[x] = , id[x] = x;
  26. if(ls <= n && d[ls] + (f[ls][] ? - : ) < d[x]) d[x] = d[ls] + (f[ls][] ? - : ), id[x] = id[ls];
  27. if(rs <= n && d[rs] + (f[rs][] ? - : ) < d[x]) d[x] = d[rs] + (f[rs][] ? - : ), id[x] = id[rs];
  28. }
  29.  
  30. int main() {
  31. // freopen("C.in", "r", stdin);
  32. // freopen("C.out", "w", stdout);
  33. cin >> n >> m;
  34. for (int i=; i<=n; ++i) scanf("%d", &c[i]);
  35. for (int i=n; i; --i) gs(i);
  36. ll ans = ;
  37. for (int i=, x; i<=m; ++i) {
  38. scanf("%d", &x);
  39. int cnt = , pmi = inf, pid = ;
  40. for (int par=x; par; par>>=) {
  41. if(d[par] + cnt < pmi) pmi = d[par] + cnt, pid = par;
  42. cnt += (f[par][] ? - : );
  43. }
  44. ans += pmi;
  45. // cout << "pid = " << pid << " pmi = " << pmi << ", id = " << id[pid] << endl;
  46. c[id[pid]] --;
  47. for (int y=id[pid]; y!=pid; y>>=) if(f[y][]) --f[y][]; else ++f[y][];
  48. for (int y=x; y!=pid; y>>=) if(f[y][]) --f[y][]; else ++f[y][];
  49. for (int y=id[pid]; y!=pid; y>>=) gs(y);
  50. for (int y=x; y!=pid; y>>=) gs(y);
  51. for (int y=pid; y; y>>=) gs(y);
  52. printf("%lld\n", ans);
  53. }
  54. return ;
  55. }

「6月雅礼集训 2017 Day2」C的更多相关文章

  1. 「6月雅礼集训 2017 Day2」B

    [题目大意] 求n*n的棋盘,每行每列都有2个黑格子的方案数. n<=10^7 [题解] zzq的做法好神奇啊 行列建点,二分图 左边有i个点,右边有j个点的方案数 f[i,j] 左边有i个点, ...

  2. 「6月雅礼集训 2017 Day2」A

    [题目大意] 给出一棵树,求有多少对点(u,v)满足其路径上不存在两个点a,b满足(a,b)=1 n<=10^5 [题解] 考虑找出所有不符合的点对,共有n*ln(n)对,他们要么是祖先-> ...

  3. 「6月雅礼集训 2017 Day10」quote

    [题目大意] 一个合法的引号序列是空串:如果引号序列合法,那么在两边加上同一个引号也合法:或是把两个合法的引号序列拼起来也是合法的. 求长度为$n$,字符集大小为$k$的合法引号序列的个数.多组数据. ...

  4. 「6月雅礼集训 2017 Day4」qyh(bzoj2687 交与并)

    原题传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2687 [题目大意] 给出若干区间,求一个区间的大于等于2的子集,使得 |区间并| 和 | ...

  5. 「6月雅礼集训 2017 Day11」delight

    [题目大意] 有$n$天,每天能吃饭.睡觉.什么事也不干 每天吃饭的愉悦值为$e_i$,睡觉的愉悦值为$s_i$,什么都不干愉悦值为0. 要求每连续$k$天都要有至少$E$天吃饭,$S$天睡觉. 求最 ...

  6. 「6月雅礼集训 2017 Day11」jump

    [题目大意] 有$n$个位置,每个位置有一个数$x_i$,代表从$i$经过1步可以到达的点在$[\max(1, i-x_i), \min(i+x_i, n)]$中. 定义$(i,j)$的距离表示从$i ...

  7. 「6月雅礼集训 2017 Day11」tree

    [题目大意] 给出一棵带权树,有两类点,一类黑点,一类白点. 求切断黑点和白点间路径的最小代价. $n \leq 10^5$ [题解] 直接最小割能过..但是树形dp明显更好写 设$f_{x,0/1/ ...

  8. 「6月雅礼集训 2017 Day10」perm(CodeForces 698F)

    [题目大意] 给出一个$n$个数的序列$\{a_n\}$,其中有些地方的数为0,要求你把这个序列填成一个1到$n$的排列,使得: $(a_i, a_j) = 1$,当且仅当$(i, j) = 1$.多 ...

  9. 「6月雅礼集训 2017 Day8」route

    [题目大意] 给出平面上$n$个点,求一条连接$n$个点的不相交的路径,使得转换的方向符合所给长度为$n-2$的字符串. $n \leq 5000$ [题解] 考虑取凸包上一点,然后如果下一个是‘R' ...

随机推荐

  1. Bug是一种财富-------研发同学的错题集、测试同学的遗漏用例集

    此文已由作者王晓明授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 各位看官,可能看到标题的你一定认为这是一篇涉嫌"炒作"的文章,亦或是为了吸引眼球而起的标 ...

  2. 手把手教你写css3通用动画

    之前接了几个微信里的项目,类似电子邀请函,什么分析报告这样的项目, 对css3动画要求十分高,每个页面客户几乎都有天马行空的想法,或者说设计师有这样的想法.众所周知css3里的keyframe写好了就 ...

  3. 玩转VIM-札记(三)

    玩转VIM-札记(三) 眨眼之间,5月就要从指间溜走,不给人一点点遐想的时间,我要赶紧抓着五月的尾巴,在博客中在添一笔.那么就还接着Vim来说吧.以Vim来为五月画上一个句号. 返璞归真 相信经过玩转 ...

  4. python接口自动化: CAS系统验证,自动完成登录并获取token,遇到302请求重定向设置(requests模块 allow_redirects=False)即可

    import requestsimport re import requests import re class Crm_token(object): try: username=int(input( ...

  5. 【转】Linux学习(1)-常用快捷键、文件管理和查询

    原文链接:http://www.cnblogs.com/zhaopei/p/7397402.html 有话要说 为什么要用Linux?要用Linux的原因太多,想说说不完啊. 如果你说用Linux只是 ...

  6. %matplotlib inline

    整理摘自 https://zhidao.baidu.com/question/1387744870700677180.html %matplotlib inline是jupyter notebook里 ...

  7. MySQL查询所有库中表名

    select table_name from information_schema.tables where table_schema='contract_ggpt' and table_type=' ...

  8. 阿里云服务器安装https证书 centos + httpd + Symantec

    一. 环境 centos7 阿里云服务器, httpd服务, 阿里云免费的Symantec证书 阿里云Symantec 有个免费版的证书, 具体怎么申请可以去百度解决 二. 网上大部分的经验贴都是要A ...

  9. for循环再探

    摘要:for循环头的组成.for的执行流程 一.for 语句的组成 0. 举个例子 for (int val = 1; val <= 10; ++val) sum += val; 1. 循环头的 ...

  10. Android Service 服务(三)—— bindService与remoteService

    (转自:http://blog.csdn.net/ithomer/article/details/7366396)   一.bindService简介 bindService是绑定Service服务, ...