[Neerc2016]Mole Tunnels (模拟费用流)
时间:2019-08-28
本文章向大家介绍[Neerc2016]Mole Tunnels (模拟费用流),主要包括[Neerc2016]Mole Tunnels (模拟费用流)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目链接: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
- java中删除特定后缀名文件
- jsp中在href中传递参数
- Druid-目前最好的连接池
- 【算法】哈希表的诞生
- java中获得文件大小代码
- 【Java】泛型学习笔记
- 读写文件具体操作
- 【算法】赫夫曼树(Huffman)的构建和应用(编码、译码)
- ERROR 1396 (HY000): Operation CREATE USER faile...
- hive安装后测试
- 【算法】论平衡二叉树(AVL)的正确种植方法
- 【JavaScript】 JS面向对象的模式与实践
- log4j:ERROR Failed to load driver
- 前端MVC Vue2学习总结(七)——ES6与Module模块化、Vue-cli脚手架搭建、开发、发布项目与综合示例
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 数据分析与数据挖掘 - 07数据处理
- MySql8.0.19最新版本创建用户分配权限演示,You have an error in your SQL syntax权限分配问题解决方法
- linux服务器oracle数据库导出dmp文件功能演示,备份数据库命令。exp命令显示command not found解决方法,EXP-00028: 无法打开dmp进行写入问题解决
- oracle数据库exp命令导入导出dmp文件演示,oracle数据库备份还原功能
- oracle数据库impdp导入dmp文件功能演示,imp导入IMP-00038: Could not convert to environment character sets handle问题解决
- 弄懂这 5 个问题,拿下 Python 迭代器!
- windows、linux下命令行登录oracle数据库方法,查询sga参数值sql语句
- oracle数据库查询open_cursors值的sql语句,达梦数据库查询MAX_SESSION_STATEMENT值方法,MAX_SESSION_STATEMENT的最大值、上限是多少。
- 达梦数据库启用日志方法,达梦数据库查看日志是否启用,达梦数据库日志文件位置查找
- JavaScript 技术篇 - js 查看哪个元素获取了焦点,js 指定元素获取焦点方法
- 工作10年后,再看String s = new String("xyz") 创建了几个对象?
- Linux达梦数据库:通过disql登录命令行操作数据库,打开达梦数据库自带的数据库管理连接工具
- Dbvis数据库连接工具将查询出数据转化为sql插入语句方法
- JavaScript 技术篇 - js通过xpath路径定位元素方法
- Python+selenium 自动化高级应用篇:借助pyautogui实现web前端带轨迹拖拽功能,解决ActionChains拖拽失效问题