题目描述

$n$ 个连续的位置,每个位置可以填入 S 和 E ,第 $i$ 个位置填入 S 可以获得 $s_i$ 的收益,填入 E 可以获得 $e_i$ 的收益。要求每连续的 $k$ 个位置必须包含至少 $t1$ 个 S 和至少 $t2$ 个 E ,问最大收益以及方案。

输入

第一行四个整数,n,k(1<=k<=n<=1000),t1,t2(0<=t1,t2<=k;t1+t2<=k),含义如上所述。
接下来一行n个整数,第i个整数si(0<=si<=1e9)表示睡觉的愉悦值。
接下来一行n个整数,第i个整数ei(0<=ei<=1e9)表示打隔膜的愉悦值。

输出

第一行输出最大的愉悦值。
接下来一行输出一个长度为n的字符串
第i个字符为E则代表第i小时在打隔膜,第i个字符为S则代表第i个小时在睡觉。

样例输入

10 4 1 2
1 2 3 4 5 6 7 8 9 10
10 9 8 7 6 5 4 3 2 1

样例输出

69
EEESESEESS


题解

线性规划与网络流

首先设 $x_i$ 表示第 $i$ 个位置是否填入 S ,是则为 1 ,否则为 0 。

那么先 “钦定” 所有的都为 $e_i$ ,把 $\sum\limits_{i=1}^ne_i$ 看作基本收益,然后再考虑 $x_i=1$ 的贡献,相当于 $x_i$ 为 1 时能够获得 $s_i-e_i$ 的收益。

因此我们要做的就是:最大化 $\sum\limits_{i=1}^n(s_i-e_i)$ ,满足对于任意的 $p$ 均有 $t1\le\sum\limits_{i=p}^{p+k-1}x_i\le k-t2$ 。

此时由于 $x_i$ 仅为 1 或 0 的限制,不能使用单纯形。

进一步推导,添加辅助变量 $y_p$ 和 $z_p$ ,将限制条件转变为等式关系:$t1+y_p=\sum\limits_{i=p}^{p+k-1}x_i= k-t2-z_p​$

于是我们就可以得到一大堆条件:

$\begin{cases}x_1+x_2+...+x_k=t1+y_1\\x_1+x_2+...+x_k=k-t2-z_1\\x_2+x_3+...+x_{k+1}=t1+y_2\\x_2+x_3+...+x_{k+1}=k-t2-z_2\\...\\...\\x_{n-k+1}+x_{n-k+2}+...+x_n=t1+y_{n-k+1}\\x_{n-k+1}+x_{n-k+2}+...+x_n=k-t2-z_{n-k+1}\end{cases}$

做题做的多了就很容易发现这些条件可以使用网络流来求解线性规划问题,具体可以参考 [NOI2008]志愿者招募 题解

继续推导,在条件的前后加入恒等式 $0=0$ ,然后下面的与上面的作差,并移项,即可得到:

$\begin{cases}x_1+x_2+...+x_k=(t1)+y_1\\y_1+z_1=(k-t1-t2)\\x_{k+1}+(k-t1-t2)=x_1+z_1+y_2\\y_2+z_2=(k-t1-t2)\\...\\...\\y_{n-k+1}+z_{n-k+1}=(k-t1-t2)\\(k-t2)=x_{n-k+1}+x_{n-k+2}+...+x_n=z_{n-k+1}\end{cases}$

(用括号括起来的是常数项)

这个形式中每一个变量都出现且仅出现了两次,且分别出现在等式左端与等式右端。

那么我们就可以使用网络流来解决。

把等式看作点,左端看作流出,右端看作流入(每个点的流量平衡,对应着等式的成立性);每个变量从其在左边的等式向其在右边的等式连边;对于常数项,出现在左边则想汇点连边,否则源点向其连边。

本题中变量 $x_i$ 的范围为 $[0,1]$ ,因此连的边容量为 1 ;又由于选 $x_i$ 会获得 $s_i-e_i$ 的收益,因此要带有费用 $s_i-e_i$;

$y_i$ 和 $z_i$ 的范围为 $[0,+\infty)$ ,因此连的边容量为 inf ,费用为0。

跑最大费用最大流,最大费用加上预先 “钦定” 好的 $\sum\limits_{i=1}^ne_i$ 即为最大收益。

输出方案直接看哪些边满流即可。

时间复杂度 $O(费用流)=O(能过)$

#include <queue>
#include <cstdio>
#include <cstring>
#define N 2010
#define M 20010
#define inf 1 << 30
using namespace std;
typedef long long ll;
queue<int> q;
int head[N] , to[M] , val[M] , id[M] , next[M] , cnt = 1 , s , t , from[N] , pre[N] , opt[N];
ll a1[N] , a2[N] , cost[M] , dis[N];
inline void add(int x , int y , int v , ll c , int i)
{to[++cnt] = y , val[cnt] = v , cost[cnt] = c , id[cnt] = i , next[cnt] = head[x] , head[x] = cnt;to[++cnt] = x , val[cnt] = 0 , cost[cnt] = -c , id[cnt] = 0 , next[cnt] = head[y] , head[y] = cnt;
}
bool spfa()
{int x , i;memset(from , -1 , sizeof(from));memset(dis , 0xc0 , sizeof(dis));dis[s] = 0 , q.push(s);while(!q.empty()){x = q.front() , q.pop();for(i = head[x] ; i ; i = next[i])if(val[i] && dis[to[i]] < dis[x] + cost[i])dis[to[i]] = dis[x] + cost[i] , from[to[i]] = x , pre[to[i]] = i , q.push(to[i]);}return ~from[t];
}
ll maxcost()
{ll ans = 0;int i , k;while(spfa()){k = inf;for(i = t ; i != s ; i = from[i]) k = min(k , val[pre[i]]);ans += k * dis[t];for(i = t ; i != s ; i = from[i]) val[pre[i]] -= k , val[pre[i] ^ 1] += k;}return ans;
}
int main()
{int n , k , t1 , t2 , i , l , r;ll ans = 0;scanf("%d%d%d%d" , &n , &k , &t1 , &t2) , s = 0 , t = 2 * n - 2 * k + 4;for(i = 1 ; i <= n ; i ++ ) scanf("%lld" , &a1[i]);for(i = 1 ; i <= n ; i ++ ) scanf("%lld" , &a2[i]) , ans += a2[i];for(i = 1 ; i <= n ; i ++ ){if(i <= k) l = 1;else l = 2 * i - 2 * k + 1;if(i > n - k) r = 2 * n - 2 * k + 3;else r = i * 2 + 1;add(l , r , 1 , a1[i] - a2[i] , i);}for(i = 2 ; i <= 2 * n - 2 * k + 2 ; i += 2)add(i , i - 1 , inf , 0 , 0) , add(i , i + 1 , inf , 0 , 0);for(i = 2 ; i <= 2 * n - 2 * k + 2 ; i ++ ){if(i & 1) add(i , t , k - t1 - t2 , 0 , 0);else add(s , i , k - t1 - t2 , 0 , 0);}add(s , 1 , t1 , 0 , 0) , add(2 * n - 2 * k + 3 , t , k - t2 , 0 , 0);printf("%lld\n" , ans + maxcost());for(i = 2 ; i <= cnt ; i ++ )if(id[i])opt[id[i]] = val[i];for(i = 1 ; i <= n ; i ++ ){if(opt[i]) printf("E");else printf("S");}return 0;
}

转载于:https://www.cnblogs.com/GXZlegend/p/7883203.html

【bzoj4842】[Neerc2016]Delight for a Cat 线性规划与网络流相关推荐

  1. Gym 101190D BZOJ 4842 Luogu P6967 LOJ #6071 [NEERC2016]Delight for a Cat (费用流)

    题目链接 (BZOJ) 大人,时代变了 (Gym) https://codeforces.com/gym/101190 (Luogu) https://www.luogu.com.cn/problem ...

  2. BZOJ.4842.[NEERC2016]Delight for a Cat(费用流)

    BZOJ 参考这儿. 首先如果一个活动的时间满足条件,那么另一个活动也一定满足.还有就是这题就是费用流没有为什么.不妨假设最初所有时间都用来睡觉,那么我们要对每个\(k\)大小区间选出\([t2,k- ...

  3. 解题报告:线性规划与网络流24题

    目录 A.飞行员配对方案问题 (二分图最大匹配)(最大流)[提高+/省选- ] B.太空飞行计划问题(最大权闭合图转最小割.最小割方案输出)[省选/NOI- ] C.最小路径覆盖问题(有向无环图最小路 ...

  4. 囧——线性规划与网络流24题之网络流入门经典

    搞了好久终于搞定线性规划与网络流24题,不过机器人路径至今无解,第22题感觉是数据错了~~~ 我的代码,数据和题目题解是BYVoid那弄到的:http://download.csdn.net/sour ...

  5. [线性规划与网络流24题] 网络流常见模型

    最近两个月在做<线性规划与网络流24题>这套题,加深了对网络流的理解. 涵盖到的模型有:二分图匹配.二分图的最大独立集.最大权闭合图.有向无环图的最小路径覆盖.最多不相交路径.最大权不相交 ...

  6. 【线性规划和网络流24题】

    (1)飞行员配对方案问题:二分图最大匹配. 思路:略. View Code 1 #include<cstdio> 2 #include<cstring> 3 #define M ...

  7. 餐巾计划问题 线性规划与网络流24题之10 费用流

    相关知识:最小费用(最大)流 问题描述: 一个餐厅在相继的N 天里, 每天需用的餐巾数不尽相同. 假设第i天需要ri块餐巾(i=1, 2,-,N).餐厅可以购买新的餐巾,每块餐巾的费用为p分:或者把旧 ...

  8. 线性规划与网络流24题 运输问题(最裸的费用流了)

    存费用流模板 用sfpa算出最小费用和路径,沿这条路径增广 1 const 2 inf=maxlongint; 3 var 4 n,m:longint; 5 map,a,w:array[0..120, ...

  9. 【线性规划与网络流24题】孤岛营救问题 分层图

    孤岛营救问题 Time Limit: 1 Sec  Memory Limit: 128 MB Description 1944年,特种兵麦克接到国防部的命令.要求马上赶赴太平洋上的一个孤岛,营救被敌军 ...

最新文章

  1. wp 删除独立存储空间文件(多级非空文件夹删除)
  2. SQL UPDATE SET FROM用法
  3. 如何编辑PDF文件,怎么修改PDF中的文字
  4. 使用CEfSharp 下载文件 弹出保存框 IDownloadHandler
  5. apache poi合并单元格设置边框
  6. 服务器win2008 R2 x64 部署ASP.net core到IIS 并解决 HTTP Error 502.5 的问题
  7. 杉岩数据:5种常见容灾复制技术图解
  8. 牛客暑期多校第五场A:gpa题解(简单01分数规划)
  9. 安卓版LightBlue 低功耗蓝牙BLE设备调试
  10. WPS无法用backspace删除空白页怎么办?
  11. 如何用计算机接收光纤网络电视,家里只有一根网络电缆. 电脑和电视如何共享互联网?如何在机顶盒和路由器之间建立连接?...
  12. HDU6184 Counting Stars(三元环计数)
  13. PLC控制系统检查与维护方法
  14. Linu常用命令精选
  15. 选用数显仪表要注意的问题
  16. python生成可执行文强案文件
  17. anaconda3更新后,菜单栏中没有Anaconda Promt
  18. 手写springIOC、AOP
  19. MFC中CreateCompatibleDC的作用
  20. [PTA]习题3-5 三角形判断

热门文章

  1. 当你用钥匙开不开门时
  2. 海量数据库解决方案2011031701
  3. vue-typescript-toast (一款适用于pc平台的简单toast)
  4. 明星居然来我们宜昌保利时代拍戏——电影《被光抓走的人》
  5. MongoDB中_class字段的作用
  6. Hive应用:外部分区表
  7. 偷天换日——新型浏览器劫持木马“暗影鼠”分析
  8. 5G研发大幕开启 终端硝烟已燃
  9. Chisel_LLDB调试命令
  10. Java之定时任务详解