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. print number

    # -*- coding: utf-8 -*-"""------------------------------------------------- File Name ...

  2. python2x如何迁移代码到python3中

    2to3 - 自动Python 2到3代码转换 2to3是一个Python程序,它读取Python 2.x源代码并应用一系列修复程序将其转换为有效的Python 3.x代码.标准库包含一组丰富的修复程 ...

  3. 解决本地SqlServer无法连接远程服务器数据库,错误10060

    本地SqlServer 连不上服务器的数据库环境,错误信息如下图,折腾来折腾去,最终还是解决了 第一步 查看服务器本地端口是否已经打开,查看方法:首先向C:\Windows\System32文件夹添加 ...

  4. [系统集成] RT(Request Tracker)执行自定义脚本及发送微信、短信的实现方法

    RT(Request Tracker)是一个基于 Perl 语言的开源状态跟踪和工作流系统,支持审批.权限管理等功能,中文化支持的也不错,可以作为企业的流程审批系统使用.可惜的是,该系统在国内使用的不 ...

  5. Redis缓存穿透和缓存雪崩以及解决方案

    Redis缓存穿透和缓存雪崩以及解决方案 Redis缓存穿透和缓存雪崩以及解决方案缓存穿透解决方案布隆过滤缓存空对象比较缓存雪崩解决方案保证缓存层服务高可用性依赖隔离组件为后端限流并降级数据预热缓存并 ...

  6. JAVA之简单编程练习

    1.有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少? 解决思路:递归方法解决,兔子的规律为数列1,1,2,3,5,8 ...

  7. 【easy-】437. Path Sum III 二叉树任意起始区间和

    /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode ...

  8. debug 2

    Red Hat Developer Toolsetdelivers the latest stable versions of essential GCC C, C++, Fortran, and s ...

  9. 如何用java实现一个p2p种子搜索(4)-种子获取

    种子获取 在上一篇中我们已经可以获取到dht网络中的infohash了,所以我们只需要通过infohash来获取到种子,最后获取种子里面的文件名,然后和获取到的infohash建立对应关系,那么我们的 ...

  10. 收藏vue技术内幕

    http://hcysun.me/vue-design/art/7vue-reactive.html#observer-%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0