BZOJ


参考这儿

首先如果一个活动的时间满足条件,那么另一个活动也一定满足。还有就是这题就是费用流没有为什么。不妨假设最初所有时间都用来睡觉,那么我们要对每个\(k\)大小区间选出\([t2,k-t1]\)个时刻打游戏,同时要让选出的\(\sum s_i-e_i\)尽量小。

假如要求打游戏的时间恰好为\(t2\)怎么做呢?

对每个时刻建一个点\(i\),由\(i\)向\(i+k\)连边(不存在则直接连向汇点),容量\(1\)费用\(s_i-e_i\)。建一个虚点\(p\),\(p\)向\(1\sim k\)每个点连容量\(1\)费用\(0\)的边,源点\(S\)向\(p\)连容量\(t2\)费用\(0\)的边。

这样如果选了\(i\)就一定会选\(i+k\),所以每个\(k\)区间都会恰好选了\(t2\)个时刻。

那现在打游戏的时间可以提高到\(k-t1\)呢。

由\(i\)向\(i+1\)连边,容量\(k-t1-t2\)费用\(0\)。\(S\)向\(p\)的连边容量改成\(k-t1\)。

这样对于每个\(k\)区间,应该有的\(t2\)条打游戏的边和之前一样,不会少走。还可以多选\(k-t1-t2\)个时刻打游戏。

线性规划的做法实在是不想看惹...出了也做不出来


//980kb	4212ms
#include <queue>
#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
#define gc() getchar()
typedef long long LL;
const int N=1007,M=3*N*2;
const LL INF=0x3f3f3f3f3f3f3f3f; int S,T,A[N],B[N],Enum,H[N],nxt[M],to[M],cap[M],len[M],cur[N];
bool vis[N];
LL Cost,dis[N]; inline int read()
{
int now=0;register char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);now=now*10+c-48,c=gc());
return now;
}
inline void AE(int u,int v,int w,int c)
{
to[++Enum]=v, nxt[Enum]=H[u], H[u]=Enum, cap[Enum]=w, len[Enum]=c;
to[++Enum]=u, nxt[Enum]=H[v], H[v]=Enum, cap[Enum]=0, len[Enum]=-c;
}
bool SPFA()
{
static bool inq[N];
static std::queue<int> q;
memset(dis,0x3f,T+1<<3);//<<3!!!
dis[S]=0, q.push(S);
while(!q.empty())
{
int x=q.front();
q.pop(), inq[x]=0;
for(int i=H[x],v; i; i=nxt[i])
if(cap[i]&&dis[to[i]]>dis[x]+len[i])
dis[v=to[i]]=dis[x]+len[i], !inq[v]&&(q.push(v),inq[v]=1);
}
return dis[T]<INF;
}
bool DFS(int x)
{
if(x==T) return 1;
vis[x]=1;
for(int &i=cur[x],v; i; i=nxt[i])
if(!vis[v=to[i]]&&dis[v]==dis[x]+len[i]&&cap[i]&&DFS(v))//&&cap[i]!!! 有必要的啊
return --cap[i],++cap[i^1],Cost+=len[i],1;
return 0;
}
void MCMF()
{
while(SPFA())
{
memcpy(cur,H,T+1<<2), memset(vis,0,T+1);
while(DFS(S));
}
} int main()
{
static int e[N];
int n=read(),K=read(),t1=read(),t2=read(),P=n+1;
Enum=1, S=0, T=n+2; LL ans=0;
for(int i=1; i<=n; ++i) ans+=A[i]=read();
for(int i=1; i<=n; ++i) B[i]=read();
AE(S,P,K-t1,0);
for(int i=1; i<=K; ++i) AE(P,i,1,0);
for(int i=1,tmp=K-t1-t2; i<=n; ++i) AE(i,i+1>n?T:i+1,tmp,0), AE(i,i+K>n?T:i+K,1,A[i]-B[i]), e[i]=Enum;
MCMF(), printf("%lld\n",ans-Cost);
for(int i=1; i<=n; ++i) putchar(cap[e[i]]?'E':'S'); return 0;
}

BZOJ.4842.[NEERC2016]Delight for a Cat(费用流)的更多相关文章

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

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

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

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

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

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

  4. [BZOJ4842]Delight for a Cat[费用流]

    题意 题目链接 分析 类似 最长k可重区间集 一题. 由于本题区间长度相同,首先可以将点的影响看成区间,区间看成点. 先默认所有位置选择事件2,选择区间看做改选事件1 .于是问题变成了求收益最大的方案 ...

  5. bzoj 4849: [Neerc2016]Mole Tunnels【模拟费用流】

    参考:https://www.cnblogs.com/CQzhangyu/p/6952371.html 费用流很简单,考虑但是会T. 考虑费用流的本质,流一次需要要找一个能够从当前点到达的距离最小的点 ...

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

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

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

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

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

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

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

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

随机推荐

  1. robot framework

    一.步骤 1.创建工程和测试套件 2.创建测试案例 3.写脚本,运行案例 4.查看运行结果 report报告主要是概括性的报告,总结案例执行情况.log报告是更为详细的案例步骤的报告. 二.RIDE工 ...

  2. C语言strcpy,strncpy和strlcpy讲解

    前言 C风格的字符串处理函数有很多,如strcpy().strcat()等等. strcpy与strcat char* strcpy (char* dest, const char* src); ch ...

  3. Python:正则表达式(一):search()、match()、findall() 的区别

    以前一直觉得正则很难,不会用,今天试验了几个方法,整理总结了一下,简洁明了. 简单来讲,正则就是 提取一段特征数据,用(.*?)代替. 自己总结的特点&区别: (.*) 贪婪匹配,会尽可能的往 ...

  4. kali下的webshell工具-Weevely

    Weevely ------------------------------------------------ 主要特点: ·         隐蔽的类终端的PHP webshell ·       ...

  5. VS Code保存使用项目Eslint规则格式化代码

    One.文件-首选项-设置-选择项目                  Two.打开右上角JSON设置            Three. 插入以下代码 { "eslint.options& ...

  6. numpy数组取每一列的数据

    也可以运用到列表中,a原本是一个列表的嵌套,将a转为了数组进行此操作,可以取固定的值,这就是numpy的好处.

  7. [mysql] 修复问题表Table '.xxxx' is marked as crashed and should be repaired

    程序执行的过程中,出现   Table '.xxxx' is marked as crashed and should be repaired 错误,上网查了一下,原来是表遭到损坏所致,具体修复办法如 ...

  8. go语言map操作

    package main import "fmt" func main() { var m = map[int]string{ 90: "优秀", 80: &q ...

  9. SQL08 清空日志文件语句

    --1.先查询数据的日志文件的名称 USE lwlz_zhiluo GO SELECT name FROM SYS.database_files WHERE type_desc='LOG' --2.执 ...

  10. Js获取客户端用户Ip地址

    利用搜狐查询接口查询Ip地址: <!DOCTYPE html> <html> <head> <meta charset="utf-8" / ...