【XSY2689】王子 - 网络流
复活!qwq
题目来源:2018冬令营模拟测试赛(九)
题意:
【背景描述】
不是所有王子都会遇见自己的中关村,主公,公主。
从前有个王子姓王,王王子遇到了一位美丽的公主,她的名字当然是公公主啦。
王王子对公公主一见钟情,他想方设法地去讨好公公主, 他准备了N个节目依次表演给公主看,每个节目他可以倒立表演,或者正常表演。王王子非常聪明,所以他总是能预估出每个节目的每种表演形式能刷多少好感度,我们记第i个节目倒立表演能增加Ai的好感度,正常表演能增加Bi的好感度。
这个公公主也不是一个省油的灯,他(没打错)看节目的时候既不喜欢太循规蹈矩,也不喜欢太标新立异。准确的说,他看的王子表演的任意连续K个节目里面,至少有P个倒立表演的节目,Q个正常表演的节目。
王王子想知道,在满足公公主的特殊癖好的前提下,他最多能刷多少的好感度。
【输入数据】
第一行四个整数N,K,P,Q。
接下来N行每行两个整数表示Ai和Bi。
【输出数据】
一行一个正整数表示答案。
【数据规模】
对于 20% 的数据,N < 16。
对于另外 30% 的数据, K < 10。
对于另外 30% 的数据, Ai, Bi < 4
对于 100% 的数据, 0 < N < 200, 0 < Ai, Bi < 10000000, 0 ≤ P + Q ≤ K ≤ N。
题解:
这种鬼畜题面和数据范围肯定就是网络流啦~
题目中一共有$N-K+1$个限制区间,显然一个节目倒立表演的话所有包含它的区间倒立表演的机会都少了一个;
那么可以把每个区间看成一个点,一个流量就表示一次倒立表演的机会,那么一个节目就会对应从最前的一个包含它的区间到最前的一个不包含它的区间的一条边,表示如果倒立表演,这些区间的机会都会减少一个(流量流掉了);
限制倒立的节目最多有多少个就相当于限制总流量,直接限制每个点到下一个点的边的流量即可;
加上最优的限制条件可以考虑先全选$A_i$,然后把费用设成$A_i-B_i$;
然后就是费用流随便跑了。
代码:
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#define inf 2147483647
#define eps 1e-9
using namespace std;
typedef long long ll;
struct edge{
int v,w,z,next;
}a[];
int n,k,p,q,ans=,N,vs,vt,tot=,head[],sp[],fr[],s1[],s2[];
bool isin[];
void add(int u,int v,int w,int z){
a[++tot].v=v;
a[tot].w=w;
a[tot].z=z;
a[tot].next=head[u];
head[u]=tot;
a[++tot].v=u;
a[tot].w=;
a[tot].z=-z;
a[tot].next=head[v];
head[v]=tot;
}
bool spfa(){
int flw,mi=inf;
queue<int>q;
memset(isin,,sizeof(isin));
for(int i=;i<=N;i++)sp[i]=-inf;
q.push(vs);
isin[vs]=true;
sp[vs]=;
while(!q.empty()){
int u=q.front();
q.pop();
isin[u]=false;
for(int tmp=head[u];tmp!=-;tmp=a[tmp].next){
int v=a[tmp].v;
if(sp[v]<sp[u]+a[tmp].z&&a[tmp].w){
fr[v]=tmp;
sp[v]=sp[u]+a[tmp].z;
if(!isin[v]){
q.push(v);
isin[v]=true;
}
}
}
}
if(sp[vt]==-inf)return false;
for(int i=vt;i!=vs;i=a[fr[i]^].v){
mi=min(mi,a[fr[i]].w);
}
for(int i=vt;i!=vs;i=a[fr[i]^].v){
ans+=mi*a[fr[i]].z;
a[fr[i]].w-=mi;
a[fr[i]^].w+=mi;
}
return true;
}
int main(){
memset(head,-,sizeof(head));
scanf("%d%d%d%d",&n,&k,&p,&q);
for(int i=;i<=n;i++){
scanf("%d%d",&s1[i],&s2[i]);
ans+=s2[i];
}
vs=;
vt=n+;
N=n+;
add(vs,N,k-q,);
for(int i=;i<=k;i++){
add(N,i,,);
}
for(int i=;i<=n;i++){
add(i,i+,k-q-p,);
if(i+k<=n)add(i,i+k,,s1[i]-s2[i]);
else add(i,vt,,s1[i]-s2[i]);
}
while(spfa());
printf("%d",ans);
return ;
}
【XSY2689】王子 - 网络流的更多相关文章
- plain framework 1 网络流 缓存数据详解
网络流是什么?为什么网络流中需要存在缓存数据?为什么PF中要采用缓存网络数据的机制?带着这几个疑问,让我们好好详细的了解一下在网络数据交互中我们容易忽视以及薄弱的一块.该部分为PF现有的网络流模型,但 ...
- 网络流模板 NetworkFlow
身边的小伙伴们都在愉快地刷网络流,我也来写一发模板好了. Network Flow - Maximum Flow Time Limit : 1 sec, Memory Limit : 65536 KB ...
- COGS732. [网络流24题] 试题库
«问题描述:假设一个试题库中有n道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性.现要从题库中抽取m 道题组成试卷.并要求试卷包含指定类型的试题.试设计一个满足要求的组卷算法.«编程任务: ...
- ACM/ICPC 之 有流量上下界的网络流-Dinic(可做模板)(POJ2396)
//有流量上下界的网络流 //Time:47Ms Memory:1788K #include<iostream> #include<cstring> #include<c ...
- BZOJ 3144 [Hnoi2013]切糕 ——网络流
[题目分析] 网络流好题! 从割的方面来考虑问题往往会得到简化. 当割掉i,j,k时,必定附近的要割在k-D到k+D上. 所以只需要建两条inf的边来强制,如果割不掉强制范围内的时候,原来的边一定会换 ...
- bzoj3572又TM是网络流
= =我承认我写网络流写疯了 = =我承认前面几篇博文都是扯淡,我写的是垃圾dinic(根本不叫dinic) = =我承认这道题我调了半天 = =我承认我这道题一开始是T的,后来换上真正的dinic才 ...
- hdu3549还是网络流
最后一次训练模板(比较熟练了) 接下来训练网络流的建图 #include <cstdio> #define INF 2147483647 int n,m,ans,x,y,z,M,h,t,T ...
- 二分图&网络流&最小割等问题的总结
二分图基础: 最大匹配:匈牙利算法 最小点覆盖=最大匹配 最小边覆盖=总节点数-最大匹配 最大独立集=点数-最大匹配 网络流: 技巧: 1.拆点为边,即一个点有限制,可将其转化为边 BZOJ1066, ...
- COGS743. [网络流24题] 最长k可重区间集
743. [网络流24题] 最长k可重区间集 ★★★ 输入文件:interv.in 输出文件:interv.out 简单对比时间限制:1 s 内存限制:128 MB «问题描述: «编 ...
随机推荐
- Asp 6种页面转向方法
asp.net 页面转向方法其实就是两种 服务器端转向和客户端转向 客户端转向实质上是指由浏览器直接向服务器端重新发送一个请求. 而服务器端转向是指服务器内部进行页面的跳转. 服务器端转向和客户端转向 ...
- BJOI2012 最多的方案
BJOI2012 最多的方案 Description 第二关和很出名的斐波那契数列有关,地球上的OIer都知道:F1=1, F2=2, Fi = Fi-1 + Fi-2,每一项都可以称为斐波那契数 ...
- centos7把编译安装的服务通过systemctl管理
nginx编译安装的目录是/usr/local/nginx nginx配置文件是/usr/local/nginx/conf/nginx.conf systemctl管理的服务文件在/usr/lib/s ...
- Elasticsearch 入门 - 基本概念
NRT Elasticsearch 是一个 接近实时 的搜索平台.这意味着从你索引文档到其可以被搜索中间存在着一个轻微的延迟(通常为1秒钟). Cluster 一个或多个节点的完整数据.聚合索引和搜索 ...
- redis 参数配置总结
redis.conf 配置项说明如下 1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程 daemonize no 2. 当Redis以守护进程方式运行时, ...
- C/C++知识要点5——智能指针原理及自己定义实现
智能指针概述: 智能指针用来管理动态对象.其行为类似于常规指针,重要的差别是:它负责自己主动释放所指向的对象. C++ 11标准库提供两种智能指针:shared_ptr.unique_ptr 差别是: ...
- Linux 技巧:让进程在后台可靠执行的几种方法
我们常常会碰到这种问题.用 telnet/ssh 登录了远程的 Linux server,执行了一些耗时较长的任务, 结果却因为网络的不稳定导致任务中途失败.怎样让命令提交后不受本地关闭终端窗体/网络 ...
- UML中的序列图(时序图)
序列图将交互关系表示为一个二维图.纵向是时间轴,时间沿竖线向下延伸. 横向轴代表了在协作中各独立对象的类元角色.类元角色用生命线表示.当对象存在时,角色用一条虚线表示,当对象的过程处于激活状态时.生命 ...
- Ruby学习(三)——类与对象(1)
今天看了<Ruby元编程>,感觉内容新颖翔实,是Ruby中难得的一见的好书,在此推荐给大家.其实今天看的主要是第一章的第一部分,先把内容梳理一下,也许这一部分会分成几天的内容来给大家介绍吧 ...
- Map (就一个json.jar)
public static void main(String[] args) { List<Map<Integer, String>> m = new ArrayList< ...