[BZOJ1283]序列
Description
给出一个长度为n的正整数序列Ci,求一个子序列,使得原序列中任意长度为m的子串中被选出的元素不超过K(K,M<=100) 个,并且选出的元素之和最大。
Input
第1行三个数N,m,k。 接下来N行,每行一个字符串表示Ci。
Output
最大和。
Sample Input
10 5 3
4 4 4 6 6 6 6 6 4 4
Sample Output
30
Solution
考虑转化一下题意,选\(1\)次转化成选\(k\)次,每次相邻\(m\)个元素只能选出一个。
可以证明这样转化是等价的。
转化之后就可以用费用流解决了,具体来说:
- \((s,1,k,0)\),\((i,i+1,k,0)\),\((n,t,k,0)\)。
- \((i,i+m,1,a_i)\ (i\leqslant n-m)\),\((i,t,1,a_i)\ (i>n-m)\)
其中\((a,b,c,d)\)表示\(a\)向\(b\)连边,容量为\(c\),费用为\(d\)。
这个图的最大费用最大流就是答案。
#include<bits/stdc++.h>
using namespace std;
void read(int &x) {
x=0;int f=1;char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f;
for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';x*=f;
}
void print(int x) {
if(x<0) putchar('-'),x=-x;
if(!x) return ;print(x/10),putchar(x%10+48);
}
void write(int x) {if(!x) putchar('0');else print(x);putchar('\n');}
const int maxn = 2e5+10;
const int inf = 1e9;
int n,m,k,s,t,tot=1,cost;
int head[maxn],dis[maxn],vis[maxn];
struct edge{int to,nxt,w,c;}e[maxn<<1];
void add(int u,int v,int w,int c) {e[++tot]=(edge){v,head[u],w,c},head[u]=tot;}
void ins(int u,int v,int w,int c) {add(u,v,w,c),add(v,u,0,-c);}
int bfs() {
memset(dis,-63,sizeof dis);
memset(vis,0,sizeof vis);
queue<int > q;q.push(s),vis[s]=1,dis[s]=0;
while(!q.empty()) {
int now=q.front();q.pop();vis[now]=0;
for(int i=head[now];i;i=e[i].nxt)
if(e[i].w>0&&dis[e[i].to]<dis[now]+e[i].c) {
dis[e[i].to]=dis[now]+e[i].c;
if(!vis[e[i].to]) vis[e[i].to]=1,q.push(e[i].to);
}
}
return dis[t]>-inf;
}
int dfs(int x,int f) {
vis[x]=1;
if(x==t) return cost+=f*dis[t],f;
int used=0;
for(int i=head[x];i;i=e[i].nxt)
if((!vis[e[i].to]||e[i].to==t)&&dis[e[i].to]==dis[x]+e[i].c&&e[i].w>0) {
int d=dfs(e[i].to,min(f-used,e[i].w));
if(d>0) e[i].w-=d,e[i^1].w+=d,used+=d;
if(used==f) break;
}
return used;
}
int mcmf() {
while(bfs()) dfs(s,inf);
return cost;
}
int main() {
read(n),read(m),read(k);s=n+1,t=s+1;
for(int i=1,x;i<=n;i++) {
read(x);if(i!=n) ins(i,i+1,k,0);
if(i<=n-m) ins(i,i+m,1,x);
else ins(i,t,1,x);
}
ins(s,1,k,0),ins(n,t,k,0);
write(mcmf());
return 0;
}
[BZOJ1283]序列的更多相关文章
- 题解-bzoj1283序列 & bzoj4842 [Neerc2016]Delight for a Cat
因为这两题有递进关系,所以放一起写 Problem bzoj1283 序列 题意概要:一个长度为 \(n\) 的序列\(\{c_i\}\),求一个子集,使得原序列中任意长度为 \(m\) 的子串中被选 ...
- BZOJ1283 序列(费用流)
不妨看做是先用k个指针指向被选择的前k个元素,然后每次将选中当前第一个元素的指针移到最后,并且需要满足位置变化量>=m.显然这样可以构造出所有的合法方案.那么可以以此建立费用流模型,以一条流量k ...
- BZOJ1283 序列 网络流区间覆盖模型
就是区间覆盖模型的费用流版. 区间覆盖模型
- 二分图&网络流&最小割等问题的总结
二分图基础: 最大匹配:匈牙利算法 最小点覆盖=最大匹配 最小边覆盖=总节点数-最大匹配 最大独立集=点数-最大匹配 网络流: 技巧: 1.拆点为边,即一个点有限制,可将其转化为边 BZOJ1066, ...
- OI网络流 简单学习笔记
持续更新! 基本上只是整理了一下框架,具体的学习给出了个人认为比较好的博客的链接. ..怎么说呢,最基础的模板我就我不说了吧qwq,具体可以参考一下这位大佬写的博客:最大流,最小割,费用流 费用流 跑 ...
- 【BZOJ1283/3550】序列/[ONTAK2010]Vacation 最大费用流
[BZOJ1283]序列 Description 给出一个长度为 的正整数序列Ci,求一个子序列,使得原序列中任意长度为 的子串中被选出的元素不超过K(K,M<=100) 个,并且选出的元素之和 ...
- 【bzoj1283】序列 线性规划与费用流
题目描述 给出一个长度为 的正整数序列Ci,求一个子序列,使得原序列中任意长度为 的子串中被选出的元素不超过K(K,M<=100) 个,并且选出的元素之和最大. 输入 第1行三个数N,m,k. ...
- [bzoj4842][bzoj1283][Neerc2016]Delight for a Cat/序列_线性规划_费用流
4842: [Neerc2016]Delight for a Cat_1283: 序列 题目大意:ls是一个特别堕落的小朋友,对于n个连续的小时,他将要么睡觉要么打隔膜,一个小时内他不能既睡觉也打隔膜 ...
- 【夯实PHP基础】UML序列图总结
原文地址 序列图主要用于展示对象之间交互的顺序. 序列图将交互关系表示为一个二维图.纵向是时间轴,时间沿竖线向下延伸.横向轴代表了在协作中各独立对象的类元角色.类元角色用生命线表示.当对象存在时,角色 ...
随机推荐
- JSP/Servlet开发——第六章 JSP开发业务应用
1. 大容量的数据显示的缺点: ●当数据量较多时,用户需要拖动页面才能浏览更多信息: ●数据定位不便: 2.分页显示: ●既能显示多条数据,又不需要拖动页面,是数据更加清晰直观,页面不再冗长,也不受数 ...
- 关于Ext.js和Ext.Net的杂谈
最近几年比较火的前端js框架extjs 算是其中的佼佼者.统一的UI设计,强悍的组件及丰富的插件,对浏览器良好的兼容性等优点使得许多公司使用Extjs,同时也使得无数程序猿开始研究这个玩意也包括我在内 ...
- TP3.2.3 接入阿里sms 短信接口
阿里云短信接口 配置文件 config.php //阿里大鱼 'Ali_SMS' =>array( 'sms_temp' =>'短信模板', 'sms_sign' =>'签名', ' ...
- flask(列表实现)
在 index/views.py 中定义视图函数 在查询的时候,如果用户分类id传0,则不添加分类查询条件 @index_blu.route('/newslist') def get_news_lis ...
- django之单表查询
一.创建表 1.创建模型: 创建名为book的app,在book下的models.py中创建模型: from django.db import models # Create your models ...
- ruby require的使用
引用单个文件 例: 引用当前rb同目录下的file_to_require.rb先介绍3种方法 require File.join(__FILE__, '../file_to_require') req ...
- javaweb 项目部署到tomcat
1.准备环境 1.安装 mysql 2.安装java 环境 3.使用idea打war包 点击 apply 生成war包 将war包传到tomcat的webapp目录下,进入tomcat安装目录,进入b ...
- 记一次MD5妙用
记一次MD5妙用 最近项目组中在做历史记录的改造工作,主持讨论了多次,但每次讨论完都觉的很完美了,但实际在写这部分逻辑的时候还是会发现一些问题出来,很难受,反反复复的暴露智商是硬伤,人艰不拆,暂先不扯 ...
- javaWeb总结
url传值时:如out.println("<td><a href = 'delete.jsp?user=" + user + "'>删除</ ...
- 洛谷(P1006 传纸条)
题目描述 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个mm行nn列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸运 ...