刷题总结——怪题(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 很忧伤, 因为他还要陪学姐去逛街呢. 后来, ...
随机推荐
- FMDB浅析(思想)
http://www.cnblogs.com/OTgiraffe/p/5931800.html 一.FMDB介绍 FMDB是一种第三方的开源库,FMDB就是对SQLite的API进行了封装,加上了面向 ...
- [学习笔记]Linux下mysql的基础操作
命令 #查看版本 mysql --version #进入mysql 命令 mysql -u root -p mysql -u root@localhost (没有密码的情况) #创建数据库 c ...
- 如何使用TensorFlow Hub和代码示例
任何深度学习框架,为了获得成功,必须提供一系列最先进的模型,以及在流行和广泛接受的数据集上训练的权重,即与训练模型. TensorFlow现在已经提出了一个更好的框架,称为TensorFlow Hub ...
- Array - Container With Most Water
/** * 此为暴力解法 * Find two lines, which together with x-axis forms a container, such that the container ...
- opencv将rgb图像转换成灰度图
python写法: import cv2 img = cv2.imread(img_dir, cv2.IMREAD_GRAYSCALE) cv2.imwrite(dis_dir, img) imrea ...
- 【转】Intellij IDEA 提交代码到远程GitHub仓库
1.文章参考自:http://my.oschina.net/lujianing/blog/180728 2.设置相关绑定 Settings——Version Control——Git——Path to ...
- SC || Git 相关知识
发现大佬的博客:https://www.cnblogs.com/onetwo/p/4157610.html 注:图片来自小姐姐的笔记~ ┉┉┉∞ ∞┉┉┉┉∞ ∞┉┉┉∞ ∞┉┉┉┉┉∞ ∞┉┉┉┉∞ ...
- helm install
reference 前提:已安装k8s:v1.10.4 helm install on master(无需下载官方tar包) 链接:https://pan.baidu.com/s/1Ji3Ru1pTQ ...
- 洛谷P3372线段树1
难以平复鸡冻的心情,虽然可能在大佬眼里这是水题,但对蒟蒻的我来说这是个巨大的突破(谢谢我最亲爱的lp陪我写完,给我力量).网上关于线段树的题解都很玄学,包括李煜东的<算法竞赛进阶指南>中的 ...
- RAID阵列搭建
RAID0 2个或2个以上磁盘,称为条带卷,无容错,可提高读写效率,其中一个磁盘损坏,所有文件不可读磁盘大小尽量统一,或者以最小的空间为标准,可用空间=N*min RAID1 2个或2个磁盘以上,称为 ...