题目链接:http://codeforces.com/gym/101190

SOLUTION:

模拟费用流

这题看完之后很容易想到费用流,但是n太大了不能直接跑。
我们考虑模拟这个费用流的增广过程,每次多了一条S->x的容量为1,费用为0的边后,我们要找一条费用最低的x->T的路径来增广,也就是要在树上找距离x最近的一个还有食物的点。因为是完全二叉树,所以我们可以直接暴力跳父亲,维护f[x]表示x子树内有食物的点到x的距离最小值,g[x]记录这个最近点的位置。那么x->xx的距离+f[xx]就可以用来更新最近点。
然后我们还要维护反向边的容量(因为正向边容量为inf,所以可以不维护),注意方向即可。

然后暴力dp维护一下可能改变的点。(log n个)
因此总的复杂度就是O(mlogn)

原文链接:https://blog.csdn.net/Icefox_zhx/article/details/80770751

因为找到一条路径后,路径上的反向边信息都变了,所以需要改一遍

路径上的所有的f【x】,

一个点的c变了,那还要给一遍从这个改变的点到root的f【x】

CODE:

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x3f3f3f3f
#define N 100010
inline char gc(){static char buf[1<<16],*S,*T;if(T==S){T=(S=buf)+fread(buf,1,1<<16,stdin);if(T==S) return EOF;}return *S++;
}
inline int read(){int x=0,f=1;char ch=gc();while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=gc();}while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=gc();return x*f;
}
int n,m,c[N],v[N][2],f[N],g[N],ans=0;//v[x][0]--x->fa[x] v[x][1]--fa[x]->x
int main(){freopen("mole.in","r",stdin);freopen("mole.out","w",stdout);n=read();m=read();memset(f,inf,sizeof(f));for(int i=1;i<=n;++i) c[i]=read();for(int i=n;i>=1;--i){if(c[i]) f[i]=0,g[i]=i;if(i>>1&&f[i]+1<f[i>>1]) f[i>>1]=f[i]+1,g[i>>1]=g[i];}while(m--){int x=read(),sum=0,y,res=inf,t;for(int xx=x;xx;xx>>=1){if(f[xx]+sum<res) res=f[xx]+sum,y=g[xx],t=xx;sum+=v[xx][0]?-1:1;}ans+=res;printf("%d",ans);if(m) putchar(' ');else puts("");c[y]--;for(int xx=x;xx!=t;xx>>=1) v[xx][0]?v[xx][0]--:v[xx][1]++;for(int xx=y;xx!=t;xx>>=1) v[xx][1]?v[xx][1]--:v[xx][0]++;for(int xx=x;xx!=t;xx>>=1){f[xx]=inf;if(c[xx]) f[xx]=0,g[xx]=xx;if(xx<<1<=n&&f[xx<<1]+(v[xx<<1][1]?-1:1)<f[xx]) f[xx]=f[xx<<1]+(v[xx<<1][1]?-1:1),g[xx]=g[xx<<1];if((xx<<1|1)<=n&&f[xx<<1|1]+(v[xx<<1|1][1]?-1:1)<f[xx]) f[xx]=f[xx<<1|1]+(v[xx<<1|1][1]?-1:1),g[xx]=g[xx<<1|1];}for(int xx=y;xx!=t;xx>>=1){f[xx]=inf;if(c[xx]) f[xx]=0,g[xx]=xx;if(xx<<1<=n&&f[xx<<1]+(v[xx<<1][1]?-1:1)<f[xx]) f[xx]=f[xx<<1]+(v[xx<<1][1]?-1:1),g[xx]=g[xx<<1];if((xx<<1|1)<=n&&f[xx<<1|1]+(v[xx<<1|1][1]?-1:1)<f[xx]) f[xx]=f[xx<<1|1]+(v[xx<<1|1][1]?-1:1),g[xx]=g[xx<<1|1];}for(int xx=t;xx;xx>>=1){f[xx]=inf;if(c[xx]) f[xx]=0,g[xx]=xx;if(xx<<1<=n&&f[xx<<1]+(v[xx<<1][1]?-1:1)<f[xx]) f[xx]=f[xx<<1]+(v[xx<<1][1]?-1:1),g[xx]=g[xx<<1];if((xx<<1|1)<=n&&f[xx<<1|1]+(v[xx<<1|1][1]?-1:1)<f[xx]) f[xx]=f[xx<<1|1]+(v[xx<<1|1][1]?-1:1),g[xx]=g[xx<<1|1];}}return 0;
}

  

转载于:https://www.cnblogs.com/zhangbuang/p/11425195.html

[Neerc2016]Mole Tunnels (模拟费用流)相关推荐

  1. BZOJ 4849 [NEERC2016] Mole Tunnels (模拟费用流)

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=4849 题解 其实也是模拟费用流,但是这道题和一般的题目不一样,这道题是在一个完全二叉树上 ...

  2. BZOJ 4849 [NEERC2016]Mole Tunnels (模拟费用流)

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=4849 题解 其实也是模拟费用流,但是这道题和一般的题目不一样,这道题是在一个完全二叉树上 ...

  3. [Neerc2016] Mole Tunnels - 模拟费用流

    题目大意: 给你一颗高度log的二叉树,在上面做动态加点最小费用最大流(S连向某个点的流量+1). 题解: 模拟维护费用流即可.暴力枚举向上跳几步,维护子树内距离最小的点(且该点有残量网络上到汇点的边 ...

  4. P6122-[NEERC2016]Mole Tunnels【模拟费用流】

    正题 题目链接:https://www.luogu.com.cn/problem/P6122 题目大意 给出nnn个点的一棵满二叉树,每个点有容量cic_ici​,mmm次从pip_ipi​处加一只仓 ...

  5. BZOJ 1920 Luogu P4217 [CTSC2010]产品销售 (模拟费用流、线段树)

    题目链接 (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=1920 (luogu) https://www.luogu.org/prob ...

  6. BZOJ 5326 [JSOI2017]博弈 (模拟费用流、线段树)

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=5326 题解 终于成为第8个A掉这题的人--orz tzw神仙早我6小时 本以为这东西常数 ...

  7. BZOJ 3836 Codeforces 280D k-Maximum Subsequence Sum (模拟费用流、线段树)

    题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=3836 (Codeforces) http://codeforces.com ...

  8. UOJ #455 [UER #8]雪灾与外卖 (贪心、模拟费用流)

    题目链接 http://uoj.ac/contest/47/problem/455 题解 模拟费用流,一个非常神奇的东西. 本题即为WC2019 laofu的讲课中的Problem 8,经典的老鼠进洞 ...

  9. [NOI2019] 序列(模拟费用流)

    原先自己想的建图: 正确建图: 但是 n 太大了,所以考虑模拟费用流: 注意: 在1中, 若选的两个位置相同,则为情况2,不用减 f: 若选的位置在另一序列中已被选,则为情况3或4,不用减 f: 若选 ...

最新文章

  1. 阿里巴巴Json工具:Fastjson教程
  2. Java从键盘输入n行字符串_Java十四天零基础入门-Java布尔类型
  3. 【bzoj2463】 谁能赢呢?
  4. Python按行输出文件内容具体解释及延伸
  5. 大话WiFi省电模式
  6. show slave status\G中的Read_Master_Log_Pos和Relay_Log_Pos的(大小)关系
  7. 最大似然估计与损失函数
  8. 标记三维点_便携式3D扫描仪全自动三坐标测量机三维扫描设计扫描测量摄影
  9. Visual Studio开启SSL的支持
  10. Redis的常用JavaAPI(Jedis)实现
  11. Node.js下载安装及各种npm、cnpm、nvm、nrm配置(保姆式教程—提供全套安装包)—nrm的安装与配置(5)
  12. 去除CAJviewer右上侧的广告栏位去除CAJviewer右上侧的广告栏位
  13. mvvm框架 android,mvvm框架原理 android 怎么使用mvvm框架
  14. 游戏建模师是做什么的?游戏建模有哪些常用软件?
  15. 花式打印菱形图案!!
  16. SpringMVC+Mybatis+Maven搭建 简单配置双数据源
  17. break语句的题目
  18. 300iq Contest 3简要题解
  19. 苹果手机计算机怎样拉到桌面,苹果手机怎样才能快速投屏到电脑屏幕上
  20. 如何开始编写微信小程序

热门文章

  1. 通过google广告赚钱
  2. 纯前端可视化大屏-免费分享(内含百度网盘链接)
  3. 2021WAIC:城感通借力媒体大数据,让城市智慧治理更进一步
  4. webug 2、布尔注入
  5. 汽车保险丝盒之E-Fuse的应用
  6. 为什么说新一代流处理器Flink是第三代流处理器(论点:发展历史、区别、适用场景)
  7. 游戏 放逐之城 baishded之mod工具BanishedKit教程
  8. 自定义小程序popupwindow弹出框
  9. win 7下Cad 2008的激活问题解决
  10. python的rename报错_python rename报错怎么解决