首页 > 其他分享 >反悔贪心(模拟费用流)

反悔贪心(模拟费用流)

时间:2024-02-15 10:55:53浏览次数:29  
标签:题意 dep sum 反悔 代价 模拟 贪心

反悔贪心(模拟费用流)

贪心本身是不能反悔的,但如果当前最优解不是全局最优解,我们就需要通过反悔来贴近全局最优解。一般用堆来实现,即堆中维护当前可以用来反悔的决策,然后每次取最优的决策。

其实从更一般的角度,反悔贪心就是建出费用流模型,然后用数据结构来模拟增广的操作。

一些例题:

CF280D k-Maximum Subsequence Sum

思路:求区间选出至多\(k\)个不相交的子段和的最大值

思路:如果\(k=1\),那么就相当于求最大子段和,可以直接贪心,可是如果拓展到\(k\)更大的情况呢?如果我们每次都直接贪心选取最大子段,这样可能会使已经选过的数不再是最优解,即需要撤销操作,而这道题的撤销就很好处理,这直接取反就可以了,接下来就是线段树的事情了。

P6122 [NEERC2016]Mole Tunnels

题意:有一棵完全二叉树,有\(m\)个人在位置\(p_i\),每个点有\(c_i\)的容量,对于\(k\in[1,n]\),求使得前\(k\)个人移动到使得每个点的人数不大于这个点容量的最小总代价。

思路:首先,显然可以简单的建立一个费用流模型,然后考虑来模拟费用流。每假如一个人,我们要做的就是找到一条增广路。设 \(f_i\) 表示一个点子树里距离它最近的 \(c_i>0\) 的位置,然后我们遍历新加的点的所有祖先,求出最小的代价,然后把路径上的正向边流量减1,反向边流量加1。边的流量可以简单的用一个数组维护,我们在经过的时候优先走对方的反向边,这样代价是-1,根据流量正负即可判断。

因为树高是\(O(\log n)\)的,所以复杂度是\(O(n\log n)\)。

P6943 [ICPC2018 WF]Conquer The World

题意:有一棵树,有边权\(c_i\),每个点有点权\(x_i\),移动每单位的点权的代价是经过的边的边权和,求总代价和的最小值。

思路:设\(dep_x\)表示\(x\)到根的路径的边权和,那么把一个点权从\(u\)移动到\(v\)的代价是\(dep_u+dep_v-2dep_{lca}\)。我们考虑如果要撤销一次移动的操作,可以操作一次\(u\)的代价改成\(-dep_v+2dep_{lca}\),就可以代表我们撤销了一次操作。

具体的,我们维护两个堆,分别表示当前子树里有的点权和需要的点权,然后每次选择代价最小的进行操作,然后将\(-dep_v+2dep_{lca}\)加入堆中。从孩子处继承时,可以使用可并堆做到\(O(n\log n)\)。

P3543 [POI2012]WYR-Leveling Ground

题意:给定\(n\)个数,每次可以选择一段区间\(+a,-a,+b,-b\),问最少操作几次可以把所有数变成0。

思路:首先,如果每个数不是\(\gcd(a,b)\)的倍数肯定无解,否则就有解,因此关键在于最少的操作次数。首先考虑做差分,那么区间加就变成了单点加。我们来看差分序列的某个数\(c_i\),那么假设\(a,b\)分别用\(x,y\)个,就有\(ax+by=c_i\),可以用拓展欧几里得求出同解,那么对于单个点,肯定是要让\(|x|+|y|\)最小,而且可以证明让总答案最小的就是\(|x|+|y|\)最小的一对\((x,y)\)。

现在的任务是让\(+-\)配对,而只有\(\sum x_i\ne 0\)时需要调整,只要调整好了,\(\sum\frac{|x|+|y|}{2}\)就是答案。调整时考虑贪心。假设\(\sum x_i>0\)就需要把一个\(x_i\)减小,对应的\(y_i\)增加,如果要保证最优就用堆来维护即可。

April Fools' Problem (hard)

题意:有\(n\)道题,第\(i\)天可以花\(a_i\)准备一道题或者花\(b_i\)打印一道题,每天最多准备一道、打印一道,求最少的准备并打印\(k\)道题的花费。

思路:看到恰好\(k\)道就想到wqs二分,而看起来又很贪心,于是就把两个结合起来。

首先二分一个值\(mid\)表示每次打印的额外花费,然后在每个点有两种决策,准备一道题或者打印前面代价最小的一道题,这个过程可以用堆来维护,于是就可以了。复杂度\(O(n\log n\log V)\)。

5.24联考T1

给定一个序列,要求选出一个子序列,设下标为\(p_1,p_2\cdots p_k\),那么需要满足\(\forall i\in[1,n],A-i\times X+\sum\limits_{p_j\leqslant i}(a_{p_j}+X)\geqslant 0\),同时要使\(\sum\limits_{i=1}^m[b_i-b_{i-1}-\sum[b_{i-1}<p_j\leqslant b_i]\geqslant h_i]\)最大。

思路:考虑第一个条件就是把没选的数当做\(-X\),选了的数当做\(a_i\),满足前缀和始终不小于\(-A\),而价值就是每个区间选择的数尽量少。考虑DP。设\(f[i][j]\)表示当前在第\(i\)个区间,当前价值为\(j\),此时前缀和最大是多少,转移时用反悔贪心来计算当前区间内的贡献即可。

P3620 [APIO/CTSC2007] 数据备份

题意:有 \(n\) 个数,要求选出 \(k\) 个互不相邻的数使得和最大。

思路:很经典的反贪。

贪心的策略就是每次选最大的,但是这样做显然不对,考虑怎么反悔。

我们反悔的操作就是把选了一个点不选,然后选择它相邻的未被选择的两个,于是我们选择一个后把它的权值改成左边的加上右边的然后减掉自己的权值即可。

标签:题意,dep,sum,反悔,代价,模拟,贪心
From: https://www.cnblogs.com/Xttttr/p/18016034

相关文章

  • Codeforces Round 169 (Div. 2)C. Little Girl and Maximum Sum(差分、贪心)
    目录题面链接题意题解代码总结题面链接C.LittleGirlandMaximumSum题意给q个[l,r]将所有这些区间里面的数相加和最大。可以进行的操作是任意排列数组题解对出现的每个区间内的位置加上1,代表权值操作完之后求一遍前缀和,得到每个位置的权值然后贪心的考虑,权值越大,应......
  • 树状数组模拟_ABC340_E - Mancala 2
    目录问题简述思路分析参考代码做题反思问题简述原题参考:E-Mancala2初始给出长度为n、m的数组a、b,要求给出m次操作后的数组a,每一次的操作流程如下:设定变量c=0;取出a[b[i]]中的数字保证手上有一个球的情况下进行以下操作:c++向a[(b[i]+c)%n]中放1可以看原题,原题有......
  • 【贪心】P7403 [BalticOI 2002 Day1] Tennis Club
    目前题解区还没有证明,我交个证明。形式化题意给定每个点的度数\(d_i\),请构造一个简单无向图(无重边无自环)。First.无解首先,根据握手定理,每个无向图的度数之和为边数的两倍,所以如果度数之和为奇数,那么肯定无解。但是发现,这种情况之外还有别的无解情况(本题有\(3\)个无解数......
  • ruffle 基于webassembly 的flash player 模拟器
    ruffle基于webassembly的flashplayer模拟器包含的特性安全 基于rust以及wasm避免一些安全问题安装简单免费开源说明官方还提供了一个demo站点可以快速体验功能参考资料https://github.com/ruffle-rs/rufflehttps://ruffle.rs/https://ruffle.rs/downloads#websi......
  • 我在代码随想录|写代码| 贪心算法 | 理论基础, 455.分发饼干, 376. 摆动序列,53. 最大
    学习目标:博主介绍:27dCnc专题:数据结构帮助小白快速入门......
  • 匀加速运动模拟python,(matplotlib)
    importnumpyasnpimportmatplotlibmatplotlib.use("TKAgg")importmatplotlib.pyplotaspltg=9.8s=100ds=0.00001#单位米v0=0.001#m/sv=[v0]t=[ds/v0]t_sum=0ds_num=int(s/ds)x=[]y=[]foriinrange(ds_num+1):ifi==0:continue......
  • Netty入门实践-模拟IM聊天
    我们使用的框架几乎都有网络通信的模块,比如常见的Dubbo、RocketMQ、ElasticSearch等。它们的网络通信模块使用Netty实现,之所以选择Netty,有2个主要原因:Netty封装了复杂的JDK的NIO操作,还封装了各种复杂的异常场景,丰富的API使得在使用上也非常方便,几行代码就可以实现高性能的网络......
  • 补基础题(贪心-1)
    Problem-2037(hdu.edu.cn)#include<iostream>/*活动安排的贪心问题*/#include<algorithm>usingnamespacestd;constintN=110;intn;structnode{intbegin,end;};boolcmp(nodeaa,nodebb){returnaa.end<bb.end;}signedmain(){ios::......
  • Android Studio 只启动安卓模拟器的脚本实现
    基本上都是参考:https://blog.csdn.net/qq_39970857/article/details/122186784一.找到SDK安装路径这俩张懒得画图,是偷的)二.win+r打开cmd(反正不用管理权限,随便怎么打开)......
  • 【洛谷 P2670】[NOIP2015 普及组] 扫雷游戏 题解(模拟)
    [NOIP2015普及组]扫雷游戏题目背景NOIP2015普及组T2题目描述扫雷游戏是一款十分经典的单机小游戏。在行列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格)。玩家翻开一个非地雷格时,该格将会出现一个数字——提示周围格子中有多少个是地雷格。游戏的......