【题目大意】

有$n$天,每天能吃饭、睡觉、什么事也不干

每天吃饭的愉悦值为$e_i$,睡觉的愉悦值为$s_i$,什么都不干愉悦值为0。

要求每连续$k$天都要有至少$E$天吃饭,$S$天睡觉。

求最大愉悦值。

$k \leq n \leq 1000, 0\leq s_i, e_i \leq 10^9, 0 \leq E+S \leq k$

【题解】

首先什么都不干这个是xjb写的肯定没有用。。

然后我们考虑费用流,我钦定n天都睡觉,那么假设有一天吃饭,那么我们换成吃饭的费用就是$e_i-s_i$。

两个限制只要考虑一个即可,因为另外一个一定满足了。

如果只有睡觉的限制,那么我们要满足的就是从$i$连到$i+1$的,容量不能超过$S$,在$i$连到$i+1$的边都表示这天我睡觉(因为已经钦定了),容量$S$,费用0。

那么吃饭没有限制,就可以从每个$i$连到$i+K$(不够的话到汇点),容量为1,费用为$e_i-s_i$。

然后我们就是求最大费用最大流。

考虑有了限制,相当于我从$i$到$i+1$的边容量变为$r-l$(上界-下界),就代表我一定要有吃饭的流量。

从$i$到$i+1$画一条纵截线,与其相交并且是$i$到$i+k$这样的边至少有$l$个。

我们再对源点容量做一下限制即可。

复杂度$O(costflow(n, 2n))$

upd: 我们把每个$k$天区间变换成$[i-k+1,i]$这样的末尾$i$表示,那么第$i$天选择吃饭,就会对于$[i, \min(i+k-1, n)]$有贡献。

问题变成,选出若干区间,使得$(k, k+1, ..., n)$都被覆盖了$[E, k-S]$次。

显然这个图可以满流,那么最大流量就是$\max_e$,也就是$k-S$,一定会流满。

那么我们限制了$i$到$i+1$的边流量为$[0, k-S-E]$,就相当于设置$i$到$i+k$的边的流量至少为$E$了。

这样就满足题目要求了

# include <queue>
# include <stdio.h>
# include <string.h>
# include <iostream>
# include <algorithm> using namespace std; typedef long long ll;
typedef unsigned long long ull;
typedef long double ld; const int N = 1e5 + , M = 1e5 + ;
const ll inf = 1e17 + ; int n, K, SS, EE;
int s[M], e[M]; int S, T;
int head[M], nxt[M], to[M], w[M], flow[M], tot = ;
inline void add(int u, int v, int fl, int _w) {
++tot; nxt[tot] = head[u]; head[u] = tot; to[tot] = v;
flow[tot] = fl, w[tot] = _w;
}
inline void adde(int u, int v, int fl, int _w) {
add(u, v, fl, _w);
add(v, u, , -_w);
} namespace MCF {
queue<int> q;
int pre[M];
ll d[M]; bool vis[M];
inline bool spfa() {
while(!q.empty()) q.pop();
for (int i=; i<=T; ++i) vis[i] = , d[i] = inf;
vis[S] = ; d[S] = ; q.push(S);
while(!q.empty()) {
int top = q.front(); q.pop(); vis[top] = ;
for (int i=head[top]; i; i=nxt[i]) {
if(d[to[i]] > d[top] + w[i] && flow[i]) {
d[to[i]] = d[top] + w[i];
pre[to[i]] = i;
if(!vis[to[i]]) {
vis[to[i]] = ;
q.push(to[i]);
}
}
}
}
return d[T] < inf;
}
inline ll mcf() {
int fl = 1e9; ll ret = ;
for (int i=pre[T]; i; i=pre[to[i^]]) fl = min(fl, flow[i]);
for (int i=pre[T]; i; i=pre[to[i^]]) {
flow[i] -= fl; flow[i^] += fl;
ret += 1ll * fl * w[i];
}
return ret;
}
inline ll main() {
ll ans = ;
while(spfa()) ans += mcf();
return ans;
}
} int main() {
// freopen("delight.in", "r", stdin);
// freopen("delight.out", "w", stdout);
cin >> n >> K >> SS >> EE;
ll sum = ;
for (int i=; i<=n; ++i) {
scanf("%d", &s[i]);
sum += s[i];
}
for (int i=; i<=n; ++i) {
scanf("%d", &e[i]);
e[i] -= s[i];
}
int mi = EE, mx = K - SS;
int S0 = n+; S = n+; T = n+;
// [mi, mx]
adde(S, S0, mx, );
for (int i=; i<=n; ++i) {
if(i <= K) adde(S0, i, 1e9, );
if(i+ <= n) adde(i, i+, mx-mi, );
else adde(i, T, mx-mi, );
if(i+K <= n) adde(i, i+K, , -e[i]);
else adde(i, T, , -e[i]);
}
cout << sum - MCF::main() << endl; return ;
}

「6月雅礼集训 2017 Day11」delight的更多相关文章

  1. 「6月雅礼集训 2017 Day11」jump

    [题目大意] 有$n$个位置,每个位置有一个数$x_i$,代表从$i$经过1步可以到达的点在$[\max(1, i-x_i), \min(i+x_i, n)]$中. 定义$(i,j)$的距离表示从$i ...

  2. 「6月雅礼集训 2017 Day11」tree

    [题目大意] 给出一棵带权树,有两类点,一类黑点,一类白点. 求切断黑点和白点间路径的最小代价. $n \leq 10^5$ [题解] 直接最小割能过..但是树形dp明显更好写 设$f_{x,0/1/ ...

  3. 「6月雅礼集训 2017 Day10」quote

    [题目大意] 一个合法的引号序列是空串:如果引号序列合法,那么在两边加上同一个引号也合法:或是把两个合法的引号序列拼起来也是合法的. 求长度为$n$,字符集大小为$k$的合法引号序列的个数.多组数据. ...

  4. 「6月雅礼集训 2017 Day4」qyh(bzoj2687 交与并)

    原题传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2687 [题目大意] 给出若干区间,求一个区间的大于等于2的子集,使得 |区间并| 和 | ...

  5. 「6月雅礼集训 2017 Day10」perm(CodeForces 698F)

    [题目大意] 给出一个$n$个数的序列$\{a_n\}$,其中有些地方的数为0,要求你把这个序列填成一个1到$n$的排列,使得: $(a_i, a_j) = 1$,当且仅当$(i, j) = 1$.多 ...

  6. 「6月雅礼集训 2017 Day8」route

    [题目大意] 给出平面上$n$个点,求一条连接$n$个点的不相交的路径,使得转换的方向符合所给长度为$n-2$的字符串. $n \leq 5000$ [题解] 考虑取凸包上一点,然后如果下一个是‘R' ...

  7. 「6月雅礼集训 2017 Day8」gcd

    [题目大意] 定义times(a, b)表示用辗转相除计算a和b的最大公约数所需步骤. 那么有: 1. times(a, b) = times(b, a) 2. times(a, 0) = 0 3. ...

  8. 「6月雅礼集训 2017 Day8」infection

    [题目大意] 有$n$个人,每个人有一个初始位置$x_i$和一个速度$v_i$,你需要选择若干个人来感染一个傻逼病毒. 当两个人相遇(可以是正面和背面),傻逼病毒会传染,求经过无限大时间后,传染完所有 ...

  9. 「6月雅礼集训 2017 Day7」电报

    [题目大意] 有n个岛屿,第i个岛屿有有向发射站到第$p_i$个岛屿,改变到任意其他岛屿需要花费$c_i$的代价,求使得所有岛屿直接或间接联通的最小代价. $1 \leq n \leq 10^5, 1 ...

随机推荐

  1. CodeForces - 792C Divide by Three (DP做法)

    C. Divide by Three time limit per test: 1 second memory limit per test: 256 megabytes input: standar ...

  2. DAY7敏捷冲刺

    站立式会议 工作安排 (1)服务器配置 服务器端项目结构调整 (2)数据库配置 单词学习记录+用户信息 (3)客户端 客户端项目结构调整,代码功能分离 燃尽图 燃尽图有误,已重新修改,先贴卡片的界面, ...

  3. android入门 — ListView点击事件

    listView中提供了两种点击事件的处理方法,分别是OnItemClick和OnItemLongClick. OnItemClick提供的是点击操作的处理,OnItemLongClick提供的是长按 ...

  4. TCP系列08—连接管理—7、TCP 常见选项(option)

    一.TCP选项概述 在前面介绍TCP头的时候,我们说过tcp基本头下面可以带有tcp选项,其中有些选项只能在连接过程中随着SYN包发送,有些可以延后.下表汇总了一些tcp选项 其中我标记为红色的部分是 ...

  5. js设计模式之代理模式以及订阅发布模式

    为啥将两种模式放在一起呢?因为这样文章比较长啊. 写博客的目的我觉得首要目的是整理自己的知识点,进而优化个人所得知识体系.知识成为个人的知识,就在于能够用自己的话表达同一种意义. 本文是设计模式系列文 ...

  6. [C/C++] 结构体存储问题

    64位操作系统,不同类型变量对应的字节数为: char : 1个字节 char*(即指针变量) : 8个字节 //32位占4个字节 short int : 2个字节 int : 4个字节 unsign ...

  7. 【Python】Python中的下划线

    单下划线(如: _var): 使用单下划线,用于指定该名变量或函数属性为“私有”.这仅仅是一个惯例,不是强制规定.用于向其他程序员表明这个变量或函数仅仅供内部使用,外部不要访问它.但实际上外部还是可以 ...

  8. 2011 Multi-University Training Contest 8 - Host by HUST

    Rank:56/147. 开场看B,是个线段树区间合并,花了2hour敲完代码...再花了30min查错..发现push_down有问题.改了就AC了. 然后发现A过了很多人.推了个公式,发现是个分段 ...

  9. NetScaler VLAN’s Demystified

    NetScaler VLAN’s Demystified https://www.citrix.com/blogs/2014/12/29/netscaler-vlans-demystified/ Th ...

  10. 【题解】CF#983 E-NN country

    首先,我们从 u -> v 有一个明显的贪心,即能向上跳的时候尽量向深度最浅的节点跳.这个我们可以用树上倍增来维护.我们可以认为 u 贪心向上跳后不超过 lca 能跳到 u' 的位置, v 跳到 ...