题目描述

$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;
}

【bzoj4842】[Neerc2016]Delight for a Cat 线性规划与网络流的更多相关文章

  1. 【BZOJ4842】[Neerc2016]Delight for a Cat 线性规划+费用流

    [BZOJ4842][Neerc2016]Delight for a Cat Description ls是一个特别堕落的小朋友,对于n个连续的小时,他将要么睡觉要么打隔膜,一个小时内他不能既睡觉也打 ...

  2. 题解-bzoj1283序列 & bzoj4842 [Neerc2016]Delight for a Cat

    因为这两题有递进关系,所以放一起写 Problem bzoj1283 序列 题意概要:一个长度为 \(n\) 的序列\(\{c_i\}\),求一个子集,使得原序列中任意长度为 \(m\) 的子串中被选 ...

  3. bzoj4842: [Neerc2016]Delight for a Cat

    bzoj4842 这是一道网络流的题(大家都看出来了吧) 首先我们简化一下题目,选出最关键的部分(就是知道什么和要求什么,还有条件) 我们在这里把睡觉设为0,至少有t0时间在睡觉,把打隔膜设为1,至少 ...

  4. [bzoj4842][bzoj1283][Neerc2016]Delight for a Cat/序列_线性规划_费用流

    4842: [Neerc2016]Delight for a Cat_1283: 序列 题目大意:ls是一个特别堕落的小朋友,对于n个连续的小时,他将要么睡觉要么打隔膜,一个小时内他不能既睡觉也打隔膜 ...

  5. bzoj 4842 [Neerc2016]Delight for a Cat 最小费用最大流,线性规划

    题意:有n个小时,对于第i个小时,睡觉的愉悦值为si,打隔膜的愉悦值为ei,同时对于任意一段连续的k小时,必须至少有t1时间在睡觉,t2时间在打隔膜.如果要获得的愉悦值尽 量大,求最大的愉悦值和睡觉还 ...

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

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

  7. bzoj 4842: [Neerc2016]Delight for a Cat【最小费用最大流】

    考试题搞了好久也没懂-- 正解应该是线性规划 https://www.cnblogs.com/CQzhangyu/p/7894559.html 可是不会写啊 如果从网络流的角度来体会大概是这样 htt ...

  8. bzoj 4842: [Neerc2016]Delight for a Cat

    Description ls是一个特别堕落的小朋友,对于n个连续的小时,他将要么睡觉要么打隔膜,一个小时内他不能既睡觉也打隔膜 ,因此一个小时内他只能选择睡觉或者打隔膜,当然他也必须选择睡觉或打隔膜, ...

  9. 【线性规划与网络流 24题】已完成(3道题因为某些奇怪的原因被抛弃了QAQ)

    写在前面:SDOI2016 Round1滚粗后蒟蒻开始做网络流来自我拯救(2016-04-11再过几天就要考先修课,现在做网络流24题貌似没什么用←退役节奏) 做的题目将附上日期,见证我龟速刷题. 1 ...

随机推荐

  1. 前端chrome调试技巧

    待更新:http://blog.csdn.net/xueer767/article/details/65936204?locationNum=8&fps=1

  2. Solr第一讲——概述与入门

    一.solr介绍 1.什么是solr Solr 是Apache下的一个顶级开源项目,采用Java开发,它是基于Lucene的全文搜索服务器.Solr可以独立运行在Jetty.Tomcat等这些Serv ...

  3. Bioinfomatics dataset

    ##Genomic sequence variation ###1000 Genomes Projecthttp://www.1000genomes.org/Data collection and a ...

  4. 创龙DSP6748开发板LED闪烁-第一篇

    1. 首先看下DSP6748的GPIO寄存器的文档,先看下框图,有这个框图,一目了然,输入和输出很清楚 2. 看下寄存器部分,对应上面的图,问题在于,DSP6748有多少个GPIO?最多144个,下一 ...

  5. unity3d 计时功能舒爽解决方案

    上次也写了一篇计时功能的博客 今天这篇文章和上次的文章实现思路不一样,结果一样 上篇文章地址:http://www.cnblogs.com/shenggege/p/4251123.html 思路决定一 ...

  6. Python3.6+selenium3.8+Firefox5.7 环境搭建

    大家好,我是阿哲,本人是从php转岗过来学习测试的一名小菜! 在学习selenium过程中,发现运行selenium有很多的问题. 我们在利用pip install selenium 安装的最新版后, ...

  7. Python3 Tkinter-PaneWindow

    1.向PanedWindow中添加Pane from tkinter import * root=Tk() panes=PanedWindow(orient=VERTICAL) panes.pack( ...

  8. Python3 Tkinter-Spinbox

    1.创建 from tkinter import * root=Tk() Spinbox(root).pack() root.mainloop() 2.参数 from_    最小值 to    最大 ...

  9. SpringCloud IDEA 教学 (五) 断路器控制台(HystrixDashboard)

    写在开头 断路器控制台是为了查看断路器运行情况而研发的.本章介绍了断路器控制台的搭建,代码基于之前Client的搭建.HystrixDashboard基于之前配置好的,使用了HystrixComman ...

  10. zookeeper启动配置

    zookeeper安装和配置详解 转载 2014年04月16日 14:36:31 16812 摘自:http://www.ibm.com/developerworks/cn/opensource/os ...