模拟流的问题小结

模拟流的问题小结

模拟流的问题一般都是通过建出流的模型,观察流的性质然后用数据结构高效模拟流。

Codeforces 280 D. k-Maximum Subsequence Sum

有一个长度为 \(n\) 的序列,单点修改,维护在这个序列中选取至多 \(k\) 个互不相交子序列的权值和最大值,\(n \leq 10^5, k \leq 20\)。

拆点后建出费用流模型

\[
(S, S',k, 0) \(S', i, 1, 0) \(i+n,T,1,0) \(i,i+n,1,a_i) \(i + n ,i + 1,1,0)
\]

观察发现,每一次增广路是 \((i,i+n,1,a_i)\) 边的最大连续子段和,那么我们可以通过维护最大连续子段和来寻找一次增广路,反向边操作只需要对选出来的区间取反,线段树直接维护即可。

2019 Multi-University Training Contest Saltyfish

有一棵大小为 \(n\) 的有根树,每个点有 \(a_i\) 个苹果,有些点有摄像头可以监控其子树内距离它 \(\leq d_i\) 的点,被监控的苹果就不能选取了,破坏这个摄像头需要 \(c_i\) 的代价,要求最大化选取的总苹果数 \(-\) 总代价。\(n \leq 3 \times 10^5\)。

经典的最大权闭合子图模型
\[
(S,i,a_i) \(j, T,c_j) \(i, j,\inf) [j\text{ can observe } i]
\]
答案是这个图的 \(\sum a_i -\) 最小割。

观察发现,一个摄像头的流量,一定是尽可能选取它管辖范围内较深的苹果的流量,显然深度较小的苹果的流量更有可能让该摄像头的祖先增广,于是维护一个关于深度的流量信息。这个东西线段树合并维护即可,势能分析一下复杂度是对的。

NOI 2019 序列

有两个长度 \(n\) 的序列 \(A, B\),需要在两个序列中各选取 \(k\) 个数,且满足两个序列选出的公共位置数 \(\geq L\),\(n \leq 10^6\) 。

费用流模型对我来说不太容易想到,关键在于建一对中间点 \(C, D\) 来限制不公共的选取。
\[
(S, S', k, 0) \(S',i,1,A_i) \(i+n,T,1,B_i) \(i, i + n, 1, 0) \(i, C, 1, 0) \(D, i + n, 1, 0) \(C, D, k - L, 0)
\]
建出费用流以后比较无脑,暴力枚举所有增广路的可能。

  1. \(S\rightarrow i\rightarrow i+n\rightarrow T\)
  2. \(S\rightarrow i\rightarrow C\rightarrow D\rightarrow i + n \rightarrow T\)
  3. \(S \rightarrow i \rightarrow i+n \rightarrow D \rightarrow j + n \rightarrow T\)
  4. \(S \rightarrow i \rightarrow C \rightarrow j \rightarrow j + n \rightarrow T\)
  5. \(S \rightarrow i \rightarrow i + n \rightarrow D \rightarrow C \rightarrow j \rightarrow j + n \rightarrow T\)

这时候先考虑维护流量,观察发现 \(S\rightarrow i,i+n \rightarrow T\) 的流量实际意义是 \(A_i/B_i\) 是否被选,\(i\rightarrow i + n\) 是流量的实际意义是 \(A_i, B_i\) 是否同时被选, \(i\rightarrow C, D \rightarrow i\) 及其反向边是否有流量的实际意义是 \(A_i/B_i\) 是否作为一个无序点对被选择了,那么我们只需要控制一下增广的总流量不超过 \(k\) ,单独维护一下 \(C \rightarrow D\) 的流量即可。

那么每一次找增广路,只需要根据这五种增广方式所走的增广路对应的实际意义选出两个点即可,同时维护一下 \(C \rightarrow D\) 的流量,注意第五种情况这条边会退流。每次选出两个点需要用若干个堆维护,细节有一点多。

在实际模拟过程中,我发现不加第五种增广也是可以过的,但是不会证明,就先写到这里好了。

注意实际上存在第 \(6\) 种增广形式,即先前让一个公共对流了 \(C \rightarrow D\) 的边,之后增广把这条流量退流,这个东西模拟起来比较麻烦,但因为公共对是否流 \(C \rightarrow D\) 边的费用一样,所以只需要控制公共对不流 \(C \rightarrow D\) 边即可。具体得分视常数 \(80-100\) 不等。

UER 8 雪灾与外卖

有 \(n\) 个老鼠,\(m\) 个洞,洞有流量 \(cap\) 和费用 \(cost\) ,老鼠到一个洞里的代价是 \(|x_i-y_j|\) ,求所有老鼠走到洞里的最小代价。

这个题的模型是经典二分图带权匹配,但是和前面几个题不一样的是,建出这个模型对于解题并没有什么用。我们可以用一个比较显然的结论进行推导,然后套上WC讲课的算法。

结论:匹配边不会交叉,因为交叉显然代价比不交叉要大。

我们从左到右考虑老鼠和洞,遇到老鼠和洞的时候钦点其匹配左边的老鼠和洞。对于老鼠,必须要匹配一个洞,如果不存在这样子的匹配,就令它匹配一个代价是 \(\inf\) 的洞,然后老鼠就可以反悔了,每次反悔相当于撤销掉这次匹配的贡献然后为下次匹配提供贡献。对于此时的洞,其没有资格反悔,因为其一旦反悔,当前这只老鼠就失去了匹配,若是其匹配的老鼠反悔后,这个洞要匹配之后的老鼠也是不可能的,因为这样子匹配就会交叉。

如果遇到一个洞,其向左匹配老鼠相当于不断让左边的老鼠反悔直到不优,注意此时洞和老鼠都是可以反悔的,老鼠的反悔同上,洞因为匹配了左边的老鼠,其可以让匹配的老鼠匹配回在加进这个洞之前的状态,然后匹配这个洞右边的老鼠。对于一个洞,其匹配的每一只老鼠进行反悔的代价都是一样的,所以可以一起处理,用堆维护任意时刻左边的老鼠和洞的反悔操作,复杂度一个 \(\log\) 。

ICPC World Finals 2018 征服世界

有 \(n\) 个节点的树,树上每个节点有一个老鼠和一个洞,洞有流量,老鼠到一个洞的代价是树上的距离,最小化所有老鼠进洞的代价。

类似于上一个题,从下到上考虑每一个节点,每条边不会被双向经过,所以当老鼠反悔的时候之前匹配的洞无需退流。我们处理 \(lca\) 为它的匹配,对于每一个匹配的贡献是老鼠和洞的深度和减去当前节点的深度的两倍,每次取出以它为 \(lca\) 的一对最优匹配增广,同时加入反悔的操作。用可并堆维护即可。

原文地址:https://www.cnblogs.com/mangoyang/p/11563486.html

时间: 2024-11-12 00:43:38

模拟流的问题小结的相关文章

重踏学习Java路上_Day21(字符流,io小结,案例)

1:字符流(掌握)    (1)字节流操作中文数据不是特别的方便,所以就出现了转换流.       转换流的作用就是把字节流转换字符流来使用.    (2)转换流其实是一个字符流        字符流 = 字节流 + 编码表    (3)编码表        A:就是由字符和对应的数值组成的一张表        B:常见的编码表            ASCII            ISO-8859-1            GB2312            GBK            G

技术调研参考——业界开源实时流处理系统小结

这里对目前业界开源的一些实时流处理系统做一次小结,作为日后进行技术调研的参考资料. S4 S4(Simple Scalable Streaming System)是Yahoo最新发布的一个开源流计算平台,它是一个通用的.分布式的.可扩展性良好.具有分区容错能力.支持插件的分布式流计算平台,在该平台上程序员可以很方便地开发面向无界不间断流数据处理的应用,开发语言为Java. 项目链接:http://incubator.apache.org/s4/(注:S4 0.5.0已支持TCP链接及状态恢复等特

(二分最大流) 最大流 + 二分查找 小结

做最大流题目的时候会遇到一种需要用二分查找的题型: (poj2455) 一张无向图中有 N 个点,M 条边,每条边都有一个权值,且每条边只能用一次,要求找出 T 条从 1 到 N 的路径,使这 T 条路径所经过的边中,权值的最大值最小. 转化为最大流模型:T就是最大流,每条边只能用一次在网络流中就是容量为1.然后二分查找(枚举),边权小于或等于mid的边就加一条容量为1的网络流的边.最后知道最大流ans与T相等的最小的mid就是所求. 在二分查找的时候,与一般的二分查找还是有区别的,一般不能有“

IO流理解方式小结

从业以来一直对IO不甚了解,每次看到都头疼不已,最近有时间小小的总结一下,下面以FileIO流为try            byte[] byt = new byte[3]; //文件输入流 FileInputStream in = new FileInputStream(new File("C:\\Users\\Administrator\\Desktop\\1.txt")); //文件输出流,输出文件与输入文件为同一件文件 FileOutputStream out = new F

解读 2018:13 家开源框架谁能统一流计算?

018 年接近尾声,我018 年接近尾声,我策划了"解读 2018"年终技术盘点系列文章,希望能够给读者清晰地梳理出重要技术领域在这一年来的发展和变化.本文是实时流计算 2018 年终盘点,作者对实时流计算技术的发展现状进行了深入剖析,并对当前大火的各个主流实时流计算框架做了全面.客观的对比,同时对未来流计算可能的发展方向进行预测和展望.策划了"解读 2018"年终技术盘点系列文章,希望能够给读者清晰地梳理出重要技术领域在这一年来的发展和变化.本文是实时流计算 20

http流请求时,被请求站点HttpContext.Current为null?

我负责运维一个短信接口站点sms.调用上游短信供应商下发短信后,他们会给我们推送发送报告.报告是类似DELIVRD.DI:9432这样的码.为了方便识别,系统里有一个报告码与其描述的关系,一开始是写死在程序里的.这样的弊端是,后期每次添加了这个映射关系后,都要更新网站程序,增大了维护成本.为了降低维护成本,我做了改进方案.将这个映射关系保存到一个文本文件ReportCodeMapper.txt里,提供一个页面来允许修改这个文件的内容. 对于使用的逻辑,声明一个静态的Dictionary,初始化时

第五篇:Hadoop流

前言 Hadoop流提供了一个API,允许用户使用任何脚本语言编写Map函数或Reduce函数. 本文对此知识点进行介绍. Hadoop流的工作原理 在以前的例子中,Map和Reduce工作都是由类来执行的,但在Hadoop流技术背景下,任何编制好的程序都能做这两个工作. 执行Map的应用程序会读取输入,并将其切分成行后作为程序的Stdin,进行处理后,将每行第一个tab符号前的内容作为key,之后的内容作为value. 如果没有tab符号,那么这一行的所有内容都会作为key,而value为空.

文件是数据(字节)流的抽象-为什么C++中会把文件操作抽象为fstream?

这不过是返祖罢了.正确的问题是为什么会把数据流抽象成文件. 设备-字节流-文件. 一切皆为文件,所有不同种类的类型都被抽象成文件(比如:块设备,socket套接字,pipe队列). 文件抽象为数据流一定程度上是 Unix 造成的. 传统上,计算机上用于 IO 的设备大致可以分成两大类,块(block)设备和流(stream)设备.前者可以抽象成一组数据块,读写必须数据块为单位,但一般可以指定任意一个数据块读写,典型的例子比如磁盘,以扇区为单位进行读写.后者可以抽象成一个数据流,你可以一个字节一个

流数据

特征: 持续到达,数据量大,注重数据整体价值,数据顺序可能颠倒,丢失,实时计算, 海量,分布,实时,快速部署,可靠 linked in Kafka spark streaming:微小批处理,模拟流计算,秒级响应 DStream 一系列RDD 的集合 支持批处理 创建文件流 10代表每10s启动一次流计算 textFileStream 定义了一个文件流数据源 任务: 寻找并跑demo代码 搭建环境 压力测试 原文地址:https://www.cnblogs.com/cschen588/p/118