bzoj4842

这是一道网络流的题(大家都看出来了吧)

首先我们简化一下题目,选出最关键的部分(就是知道什么和要求什么,还有条件)

我们在这里把睡觉设为0,至少有t0时间在睡觉,把打隔膜设为1,至少t2时间在打隔膜(方便下面描述)

这样的话就转换成了一个序列问题 ,数列上的点可以选为0或1,第i个位置选0有si的收益,选1有ei的收益,长度为k的序列里至少有t0个0和t1个1。求如何填数才能令这个序列达的收益最大,输出最大收益和填数方案。

样例就不用解释了吧,大家都懂。

假设所有点都选了0,操作由赋值0或1改为将哪些0变为1后更优,每一个0变为1后都有ei-si的收益,一个长度为k的区间内至少有t1个1,定为下界L=t1,至多有k-t0个1(至少有t0个0)定为上界U,(是有上下界的网络流的题!!不过正解不是那样)这样变换后可以试操作更简单。

既然是网络流的,我们考虑怎么建图,一看是一个序列,先把序列上的点依次连接起来S连向1,n连向T,中间的i连向i+1;

然后步入正题,看看本题应该怎么做,参考一下下图:

先只考虑有上界的问题

对于每个点i,我们将它像i+k号点连一条边,表示选了这个点(0改为1),将这一点的流量分走,分向下一个区间,剩下的流量就 -1  表示这个区间内能改的点的个数-1。

将S流向1 的边流量设定为上界U,这样可以保证每个k区间的流量都<=上界。这样就能控制住每个区间内最多分出去U的流量,就是说最多选上界个点;

再考虑下界,就是最少选L个1;也就是说要让这个区间内最少流出L的流量,那么剩下的流量最多就只能流U-L了。所以我们把每个区间末尾的那个边的流量定为U-L控制最多剩下多少流量。

(大家用各种优美姿势感性理解一下)

还有注意不要全开long long ;

不开long long会爆int ,全开会超时~~~这个东西卡了我一个小时。。

至于怎么输出方案,大家胡乱搞一下就好了。

 #include<iostream>
#include<queue>
#include<bit/stdc++.h>
using namespace std;
#define LL long long
#define C continue
#define B break
#define MAXN 101000
#define inf 100000007
inline LL read()
{
LL x=,f=;
char ch=getchar();
while(ch>''||ch<''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=(x<<)+(x<<)+ch-'';ch=getchar();}
return x*f;
}
int n,k,t0,t1,S,T,lin[MAXN],t=;
int v[MAXN],pre[MAXN],U,L,id[MAXN],S0;
LL aa,d[MAXN],AKAKAKAK[MAXN],a[MAXN],ans=,sum;
int incf[MAXN];
struct adge{
int y,ne,c,v;
}e[*MAXN];
void insert(int xx,int yy,int cc,int vv)
{
e[++t].y=yy;e[t].v=vv;e[t].c=cc;e[t].ne=lin[xx];lin[xx]=t;
e[++t].y=xx;e[t].v=-vv;e[t].c=;e[t].ne=lin[yy];lin[yy]=t;
}queue<int> q;
bool SP_spfa(int st)
{
while(q.size())q.pop();
memset(d,,sizeof(d));
aa=d[];
memset(v,,sizeof(v));
q.push(st),d[st]=,v[st]=;
incf[st]=(<<);
while(q.size())
{
int x=q.front();
q.pop();
v[x]=;
for(int i=lin[x];i;i=e[i].ne)
{
int y=e[i].y;
if(d[y]>d[x]+e[i].v&&e[i].c)
{
d[y]=d[x]+e[i].v;
incf[y]=min(incf[x],e[i].c);
pre[y]=i;
if(!v[y])
{
v[y]=;
q.push(y);
}
}
}
}
if(d[T]==aa) return ;
return ;
}
void Update()
{
int x=T;
while(x!=S)
{
int i=pre[x];
e[i].c-=incf[T];
e[i^].c+=incf[T];
x=e[i^].y;
}
ans+=(LL)d[T]*incf[T];
}
int main()
{
//freopen("www.in","r",stdin);
//freopen("www.out","w",stdout);
n=read(),k=read(),t0=read(),t1=read();
for(int i=;i<=n;++i) AKAKAKAK[i]=read(),sum+=AKAKAKAK[i];
for(int i=;i<=n;++i) a[i]=read()-AKAKAKAK[i];
S=,T=n+;U=k-t0;L=t1;S0=n+;
insert(S,S0,U,);
for(int i=;i<=n;++i)
{
/*insert(i,min(i+k,T),1,-a[i]);
if(i<k) insert(i,i+1,inf,0);
else insert(i,i+1,U-L,0);*/
if(i<=k) insert(S0,i,inf,);
insert(i,min(i+,T),U-L,);
insert(i,min(i+k,T),,-a[i]);
id[i]=t;
}
while(SP_spfa(S))Update();
cout<<sum-ans<<endl;
for(int i=;i<=n;++i) {
if(e[id[i]^].c) putchar('S');
else putchar('E');
}
//cout<<s<<endl;
return ;
}

代码

bzoj4842: [Neerc2016]Delight for a Cat的更多相关文章

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

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

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

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

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

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

  4. 【bzoj4842】[Neerc2016]Delight for a Cat 线性规划与网络流

    题目描述 $n$ 个连续的位置,每个位置可以填入 S 和 E ,第 $i$ 个位置填入 S 可以获得 $s_i$ 的收益,填入 E 可以获得 $e_i$ 的收益.要求每连续的 $k$ 个位置必须包含至 ...

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

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

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

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

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

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

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

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

  9. bzoj4842 Delight for a Cat

    题意:n天内你每天可以s或者e,分别有一定的收益. 每连续k天中s的天数要大于ds,e的天数要大于de,求最大收益. 解:费用流解线性规划. 先假设全部选e,然后一天s的收益为si - ei ai表示 ...

随机推荐

  1. Ant+jmeter+jenkins搭建测试的持续集成

    前提: Ant+jmeter 已经搭建完成并成功运行(参看ant+jmeter自动化性能测试) Jenkins在本地已经安装可运行(参看上一篇) 1.下载Jenkins安装 2.浏览器输入地址http ...

  2. Ubuntu切换阿里源

    sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak #备份 sudo vim /etc/apt/sources.list #修改 sudo ...

  3. linux查看端口号监听状态

    lsof -i:<port> netstat -tunlp | grep <port>

  4. 一起做RGB-D SLAM(7) (完结篇)

    第七讲 添加回环检测 2016.11 更新 把原文的SIFT替换成了ORB,这样你可以在没有nonfree模块下使用本程序了. 回环检测的阈值作出了相应的调整. 请以现在的github上源码为准. 简 ...

  5. IntelliJ IDEA 2017版 快捷键CTRL + SHIFT + A无效如何调试(详细的开启idea自动make功能 )

    1.前景描述 因为我把编译器的快捷键都设置成eclipse模式了,所以要做热部署的时候,需要CTRL + SHIFT + A --> 查找Registry --> 找到并勾选compile ...

  6. 在VMware中设置CentOS7的网络

    为了能够使用XShell来管理我们安装好的CentOS7系统,所以我们要先设置CentOS7的网络使其能够联网.  1.选择vmware的编辑,然后点击虚拟网络编辑器     2.点击更改设置(需要有 ...

  7. 6、Docker Image

    6.1 什么是image 文件和meta data的集合(root filesystem) 分层的,并且每一层都可以添加.改变.删除文件,成为一个新的image 不同的image可以共享相同的laye ...

  8. Lucene的数值索引以及范围查询

    对文本搜索引擎的倒排索引(数据结构和算法).评分系统.分词系统都清楚掌握之后,本人对数值索引和搜索一直有很大的兴趣,最近对Lucene对数值索引和范围搜索做了些学习,并将主要内容整理如下: 1. Lu ...

  9. 使用google chrome抓取数据:抓取全国的高中的数据

    http://tomycat.github.io/blog/other/2014/05/28/use-google-chrome-capture-data.html

  10. 一键部署react到nginx上

    仅用于记录自己的程序部署 cd /home/web; rm -rf JulyNovelReact; mkdir JulyNovelReact; cd JulyNovelReact; rz; tar - ...