刷题总结——怪题(ssoj费用流)
题目:
题目描述
给出一个长度为 n 的整数序列 hi ,现在要通过一些操作将这个序列修改为单调不降序列,即 hi≤hi+1 。
可以用的操作有 m 种,第 i 种操作可以通过支付 ci 的代价将一段长度恰为 li 的连续子序列 +1 或 −1(由对应的操作符确定是 +1 还是 −1 ,具体参考输入格式)。
不限制每种操作的使用次数,序列中的 hi 可以被改为任意整数(可以是负数),求最小代价,无解输出 −1 。
输入格式
第一行,两个整数 n,m 。
第二行,n 个整数 hi 。
接下来 m 行,每行格式为 opi,li,ci ,空格隔开,其中 opi 为一个字符,表示这种操作是 +1 还是 −1 。
输出格式
输出一行一个整数表示最小代价,若无解输出 -1 。
样例数据 1
样例数据 2
样例数据 3
输入 [复制]
10 10
23 1 8 14 2 3 15 50 53 53
+ 4 6
- 1 10
+ 2 4
+ 4 2
- 3 5
+ 1 2
+ 3 2
+ 5 7
- 1 6
+ 4 5
输出
96
备注
【数据规模】
对于 20% 的数据:n,m≤5;hi≤10;ci≤3 ;
对于另 20% 的数据:li=1;hi≤500 ;
对于 100% 的数据:n,m≤200;li≤n;1≤hi,ci≤106 。
题解:

其实这道题看数据范围外加分析是很容易猜出是费用流的·····难的是建图····
代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cctype>
#include<cstring>
#include<string>
#include<algorithm>
#include<queue>
using namespace std;
const int N=;
const int M=;
const int INF=0x3f3f3f3f;
queue<int>que;
int tot=,first[N],next[M],go[M],rest[M],cost[M],S,T;
int n,m,h[N],Tot,totflow,dis[N];
long long ans=;
bool visit[N],work[N];
char s[];
inline int R()
{
char c;int f=,i=;
for(c=getchar();(c<''||c>'')&&c!='-';c=getchar());
if(c=='-') c=getchar(),i=-;
for(;c<=''&&c>='';c=getchar())
f=(f<<)+(f<<)+c-'';
return f*i;
}
inline void comb(int a,int b,int v,int w)
{
next[++tot]=first[a],first[a]=tot,go[tot]=b,rest[tot]=v,cost[tot]=w;
next[++tot]=first[b],first[b]=tot,go[tot]=a,rest[tot]=,cost[tot]=-w;
}
inline bool spfa()
{
memset(dis,INF,sizeof(dis));memset(work,false,sizeof(work));dis[S]=;
que.push(S);
while(!que.empty())
{
int u=que.front();que.pop();visit[u]=false;
for(int e=first[u];e;e=next[e])
{
int v=go[e];
if(dis[v]>dis[u]+cost[e]&&rest[e]>)
{
dis[v]=dis[u]+cost[e];
if(!visit[v])
{
visit[v]=true;que.push(v);
}
}
}
}
return dis[T]!=INF;
}
inline int dinic(int u,int flow)
{
if(u==T)
{
ans+=(long long)dis[T]*flow;
return flow;
}
int v,delta,res=;work[u]=true;
for(int e=first[u];e;e=next[e])
{
if(dis[v=go[e]]==dis[u]+cost[e]&&rest[e]>&&!work[v])
{
delta=dinic(v,min(flow-res,rest[e]));
if(delta)
{
res+=delta;rest[e]-=delta;rest[e^]+=delta;
if(res==flow) break;
}
}
}
return res;
} inline void maxflow()
{
while(spfa())
totflow+=dinic(S,INF);
}
int main()
{
//freopen("a.in","r",stdin);
n=R(),m=R();S=,T=n+;
for(int i=;i<=n;i++)
{
h[i]=R();
if(i==) comb(S,i,INF,);
else
{
if(h[i]-h[i-]>) comb(S,i,h[i]-h[i-],);
else if(h[i]-h[i-]<) comb(i,T,h[i-]-h[i],),Tot+=h[i-]-h[i];
}
}
comb(S,n+,INF,);int l,c;
while(m--)
{
scanf("%s",s);l=R(),c=R();
if(s[]=='+')
for(int i=n+;i-l>=;i--) comb(i,i-l,INF,c);
else
for(int i=;i+l<=n+;i++) comb(i,i+l,INF,c);
}
maxflow();
if(totflow!=Tot) cout<<"-1"<<endl;
else cout<<ans<<endl;
return ;
}
刷题总结——怪题(ssoj费用流)的更多相关文章
- 2018.10.15 loj#6010. 「网络流 24 题」数字梯形(费用流)
		
传送门 费用流经典题. 按照题目要求建边. 为了方便我将所有格子拆点,三种情况下容量分别为111,infinfinf,infinfinf,费用都为validi,jval_{id_{i,j}}valid ...
 - 2018.10.15 loj#6013. 「网络流 24 题」负载平衡(费用流)
		
传送门 费用流sb题. 直接从sss向每个点连边,容量为现有物品量. 然后从ttt向每个点连边,容量为最后库存量. 由于两个点之间可以互相任意运送物品,因此相邻的直接连infinfinf的边就行了. ...
 - 【Codevs1237&网络流24题餐巾计划】(费用流)
		
题意:一个餐厅在相继的 N 天里,每天需用的餐巾数不尽相同. 假设第 i 天需要 ri块餐巾(i=1,2,…,N).餐厅可以购买新的餐巾,每块餐巾的费用为 p 分: 或者把旧餐巾送到快洗部,洗一块需 ...
 - CF 277E Binary Tree on Plane (拆点 + 费用流) (KM也可做)
		
题目大意: 平面上有n个点,两两不同.现在给出二叉树的定义,要求树边一定是从上指向下,即从y坐标大的点指向小的点,并且每个结点至多有两个儿子.现在让你求给出的这些点是否能构成一棵二叉树,如果能,使二叉 ...
 - [NOI2012]美食节(费用流)
		
题目描述 CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴.他很快就尝遍了美食节所有的美食.然而,尝鲜的欲望是难以满足的.尽管所有的菜品都 ...
 - 线性规划费用流解法(Bzoj1061: [Noi2008]志愿者招募)
		
题面 传送门 Sol 线性规划费用流解法用与求解未知数为非负数的问题 这道题可以列出一堆形如 \(x[i]+x[j]+x[k]+...>=a[p]\) 的不等式 我们强行给每个式子减去一个东西, ...
 - 【BZOJ2245】[SDOI2011]工作安排 拆边费用流
		
[BZOJ2245][SDOI2011]工作安排 Description 你的公司接到了一批订单.订单要求你的公司提供n类产品,产品被编号为1~n,其中第i类产品共需要Ci件.公司共有m名员工,员工被 ...
 - 刷题总结——支线剧情(bzoj3876费用流)
		
题目: [故事背景] 宅男JYY非常喜欢玩RPG游戏,比如仙剑,轩辕剑等等.不过JYY喜欢的并不是战斗场景,而是类似电视剧一般的充满恩怨情仇的剧情.这些游戏往往 都有很多的支线剧情,现在JYY想花费最 ...
 - 刷题总结——学姐的逛街计划(vijos1891费用流)
		
题目: doc 最近太忙了, 每天都有课. 这不怕, doc 可以请假不去上课.偏偏学校又有规定, 任意连续 n 天中, 不得请假超过 k 天. doc 很忧伤, 因为他还要陪学姐去逛街呢. 后来, ...
 
随机推荐
- 使用notepad++远程编辑Linux文档
			
上一篇中,我写了如何使用使用ftp服务器实现很方便的通信,这一篇我分享一个使用notepad++的一个NPPFTP插件远程编辑Linux中的文档的小技巧. 首先要确保你的Linux的ftp服务已经打开 ...
 - 《队长说得队》第八次团队作业Alpha冲刺
			
项目 内容 这个作业属于哪个课程 >>2016级计算机科学与工程学院软件工程(西北师范大学) 这个作业的要求在哪里 >>实验十二 团队作业8:软件测试与ALPHA冲刺 团队名称 ...
 - oracle 将查询结果输出到txt文件里
			
在查询语句里先输入spool filepath 中间是需要查询的语句,最后spool off 就会把中间查询的结果都输入到file文件里 spool E:\log.txt; select id,nam ...
 - iOS开发遇到的坑之六--使用cocopods管理第三方库时,编译出现Library not found for -lPods问题的解决办法
			
在项目中有时候会遇到Library not found for -lPods(这里的IPods指的是你具体的第三方库)的问题 出现这个错误的原因是:xcode在编译的时候找不到这个库,从而导致项目无法 ...
 - springboot下https证书配置
			
没有证书的小伙伴首先申请一个阿里云免费证书,按照我的步骤来操作 1.购买页面是这样的 按照顺序选择 神奇的一幕出现了 然后就去购买成功,我们会看到证书没有签发,我们需要去申请 填写需要绑定的域名 一般 ...
 - 批量ping IP并检测IP延迟率和丢包率脚本
			
脚本文件如下: #!/bin/bash #Author:Mr.Ding #Created Time:2018-08-26 07:23:44 #Name:ping.sh #Description: sh ...
 - OwinStartupAttribute出错
			
尝试加载应用时出现了以下错误.- 找不到包含 OwinStartupAttribute 的程序集.- 找不到包含 Startup 或 [AssemblyName].Startup 类的程序集.若要禁用 ...
 - mysql的字符串连接符
			
以前用SQL Server 连接字符串是用“+”,现在数据库用mysql,写个累加两个字段值SQL语句居然不支持"+",郁闷了半天在网上查下,才知道mysql里的+是数字相加的操作 ...
 - 配置wamp开发环境之mysql的配置
			
此前我已经将wamp配置的Apache.PHP.phpmyadmin全部配置完成,以上三种配置参照 配置wamp开发环境 下面我们来看看mysql的配置,这里用的是mysql5.5.20,下载地址: ...
 - 这五本Python急速入门必读的书,送给正在学习Python的你!
			
书籍是人类进步的阶梯,这句话从古至今都是适用的.为什么会这么说呢?书籍,它记录了人们实践的经验,这些经验有助于我们快速的学习,对于编程学习来说也不例外,今天就给大家带来了以下的书籍干货,希望能够帮助到 ...