正题

题目链接:https://www.luogu.com.cn/problem/P6122


题目大意

给出\(n\)个点的一棵满二叉树,每个点有容量\(c_i\),\(m\)次从\(p_i\)处加一只仓鼠然后求每只仓鼠都到一个点的最短路径长度和。

\(1\leq n\leq 10^5\)


解题思路

模拟费用流的思想就是....模拟费用流(字面意思

因为是满二叉树,我们对于每个节点维护一个往下最短的路径还有容量的节点(需要注意的是路径上如果流量是反向的话长度要是\(-1\))。

然后暴力更新这条路径上的流量,再更新一下刚刚那个东西就好了。

时间复杂度\(O(n\log n)\)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=4e5+10;
int n,m,c[N],dis[N],pos[N],flow[N],ans;
void updata(int x){
dis[x]=2147483647/3;pos[x]=0;
if(c[x])dis[x]=0,pos[x]=x;
if(dis[x*2]+(flow[x*2]>0?-1:1)<dis[x])
dis[x]=dis[x*2]+(flow[x*2]>0?-1:1),pos[x]=pos[x*2];
if(dis[x*2+1]+(flow[x*2+1]>0?-1:1)<dis[x])
dis[x]=dis[x*2+1]+(flow[x*2+1]>0?-1:1),pos[x]=pos[x*2+1];
return;
}
int main()
{
scanf("%d%d",&n,&m);
memset(dis,0x3f,sizeof(dis));
for(int i=1;i<=n;i++)scanf("%d",&c[i]);
for(int i=n;i>=1;i--)updata(i);
for(int i=1;i<=m;i++){
int p;scanf("%d",&p);
int x=0,cost=2147483647/3,now=0;
for(int y=p;y!=0;y>>=1){
if(now+dis[y]<cost)
cost=now+dis[y],x=y;
now+=(flow[y]<0?-1:1);
}
ans+=cost;
for(int y=p;y!=x;y>>=1)flow[y]++;
for(int y=pos[x];y!=x;y>>=1)flow[y]--;
c[pos[x]]--;
for(int y=pos[x];y!=x;y>>=1)updata(y);
for(int y=p;y!=0;y>>=1)updata(y);
printf("%d ",ans);
}
return 0;
}

P6122-[NEERC2016]Mole Tunnels【模拟费用流】的更多相关文章

  1. 【BZOJ4849】[Neerc2016]Mole Tunnels 模拟费用流

    [BZOJ4849][Neerc2016]Mole Tunnels Description 鼹鼠们在底下开凿了n个洞,由n-1条隧道连接,对于任意的i>1,第i个洞都会和第i/2(取下整)个洞间 ...

  2. BZOJ4849[Neerc2016]Mole Tunnels——模拟费用流+树形DP

    题目描述 鼹鼠们在底下开凿了n个洞,由n-1条隧道连接,对于任意的i>1,第i个洞都会和第i/2(取下整)个洞间有一条隧 道,第i个洞内还有ci个食物能供最多ci只鼹鼠吃.一共有m只鼹鼠,第i只 ...

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

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

  4. 贪心(模拟费用流):NOIP2011 观光公交

    [问题描述] 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第0 分钟出现在1号景点,随后依次前往2. ...

  5. BZOJ4977[Lydsy1708月赛]跳伞求生——贪心+堆+模拟费用流

    题目链接: 跳伞求生 可以将题目转化成数轴上有$n$个人和$m$个房子,坐标分别为$a_{i}$和$b_{i}$,每个人可以进一个他左边的房子,每个房子只能进一个人.每个房子有一个收益$c_{i}$, ...

  6. 【bzoj1150】[CTSC2007]数据备份Backup 模拟费用流+链表+堆

    题目描述 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游戏 ...

  7. [UOJ455][UER #8]雪灾与外卖——堆+模拟费用流

    题目链接: [UOJ455]雪灾与外卖 题目描述:有$n$个送餐员(坐标为$x_{i}$)及$m$个餐厅(坐标为$y_{i}$,权值为$w_{i}$),每个送餐员需要前往一个餐厅,每个餐厅只能容纳$c ...

  8. 【CF280D】 k-Maximum Subsequence Sum ,线段树模拟费用流

    昨天考试被教育了一波.为了学习一下\(T3\)的科技,我就找到了这个远古时期的\(cf\)题(虽然最后\(T3\)还是不会写吧\(QAQ\)) 顾名思义,这个题目其实可以建成一个费用流的模型.我们用流 ...

  9. Codeforces 280D k-Maximum Subsequence Sum [模拟费用流,线段树]

    洛谷 Codeforces bzoj1,bzoj2 这可真是一道n倍经验题呢-- 思路 我首先想到了DP,然后矩阵,然后线段树,然后T飞-- 搜了题解之后发现是模拟费用流. 直接维护选k个子段时的最优 ...

随机推荐

  1. Azkaban入门(启动一个Simple Example)

    Azkaban简介 azkaban是一个开源的任务调度系统 Azkaban是一套简单的任务调度服务,整体包括三部分webserver.dbserver.executorserver. 开发语言为Jav ...

  2. c#反射入门篇(Reflection)——MethodInfo 发现方法的属性

    网站:https://www.jianshu.com/p/52dc85668d00 也算记录自己的学习篇=.= 适合入门看 这里简单介绍下MethodInfo和他基本的几个方法 简介 MethodIn ...

  3. WebAPI 自定义过滤

    自定义filter 类过滤 ------------------------------------------------------------------------- public class ...

  4. Dijkstra链路状态选路算法

  5. Go: 复合数据类型struct

    结构体 结构体是将零个或多个任意类型的命名变量组合在一起的聚合数据类型.每个变量都叫做结构体的成员. type Employee struct { ID int Name string age int ...

  6. 媒体查询media query

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  7. vue-父子组件之传值和单项数据流问题

    前言 我们知道 vue 中父子组件的核心概念是单项数据流问题,props 是单项传递的.那究竟什么是单项数据流问题,这篇文章来总结一下关于这个知识点的学习笔记. 正文 1.父组件传值给子组件 < ...

  8. Vue Router路由导航及传参方式

    路由导航及传参方式 一.两种导航方式 ①:声明式导航 <router-link :to="..."> ②:编程式导航 router.push(...) 二.编程式导航参 ...

  9. 使用 Dockerfile 自定义 Nginx 镜像

    一般来说,自定义Nginx只需要把静态文件放到镜像里就可以了,不需要重写 CMD 与 ENTRYPOINT.但是,如果的确需要在 Nginx 启动前执行一些操作,就需要重写 CMD 了,如果写成下边就 ...

  10. JS获取DOM元素的八种方法

    JS获取DOM元素的方法(8种) 通过ID获取(getElementById) 通过name属性(getElementsByName) 通过标签名(getElementsByTagName) 通过类名 ...