题目:

题目描述

给出一个长度为 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

输入  [复制]

 

3 2 
3 2 1 
+ 1 1 
- 1 1

输出

2

样例数据 2

输入  [复制]

 

3 1 
3 2 1 
+ 2 1

输出

-1

样例数据 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费用流)的更多相关文章

  1. 2018.10.15 loj#6010. 「网络流 24 题」数字梯形(费用流)

    传送门 费用流经典题. 按照题目要求建边. 为了方便我将所有格子拆点,三种情况下容量分别为111,infinfinf,infinfinf,费用都为validi,jval_{id_{i,j}}valid ...

  2. 2018.10.15 loj#6013. 「网络流 24 题」负载平衡(费用流)

    传送门 费用流sb题. 直接从sss向每个点连边,容量为现有物品量. 然后从ttt向每个点连边,容量为最后库存量. 由于两个点之间可以互相任意运送物品,因此相邻的直接连infinfinf的边就行了. ...

  3. 【Codevs1237&网络流24题餐巾计划】(费用流)

    题意:一个餐厅在相继的 N 天里,每天需用的餐巾数不尽相同. 假设第 i 天需要 ri块餐巾(i=1,2,…,N).餐厅可以购买新的餐巾,每块餐巾的费用为 p 分: 或者把旧餐巾送到快洗部,洗一块需 ...

  4. CF 277E Binary Tree on Plane (拆点 + 费用流) (KM也可做)

    题目大意: 平面上有n个点,两两不同.现在给出二叉树的定义,要求树边一定是从上指向下,即从y坐标大的点指向小的点,并且每个结点至多有两个儿子.现在让你求给出的这些点是否能构成一棵二叉树,如果能,使二叉 ...

  5. [NOI2012]美食节(费用流)

    题目描述 CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴.他很快就尝遍了美食节所有的美食.然而,尝鲜的欲望是难以满足的.尽管所有的菜品都 ...

  6. 线性规划费用流解法(Bzoj1061: [Noi2008]志愿者招募)

    题面 传送门 Sol 线性规划费用流解法用与求解未知数为非负数的问题 这道题可以列出一堆形如 \(x[i]+x[j]+x[k]+...>=a[p]\) 的不等式 我们强行给每个式子减去一个东西, ...

  7. 【BZOJ2245】[SDOI2011]工作安排 拆边费用流

    [BZOJ2245][SDOI2011]工作安排 Description 你的公司接到了一批订单.订单要求你的公司提供n类产品,产品被编号为1~n,其中第i类产品共需要Ci件.公司共有m名员工,员工被 ...

  8. 刷题总结——支线剧情(bzoj3876费用流)

    题目: [故事背景] 宅男JYY非常喜欢玩RPG游戏,比如仙剑,轩辕剑等等.不过JYY喜欢的并不是战斗场景,而是类似电视剧一般的充满恩怨情仇的剧情.这些游戏往往 都有很多的支线剧情,现在JYY想花费最 ...

  9. 刷题总结——学姐的逛街计划(vijos1891费用流)

    题目: doc 最近太忙了, 每天都有课. 这不怕, doc 可以请假不去上课.偏偏学校又有规定, 任意连续 n 天中, 不得请假超过 k 天. doc 很忧伤, 因为他还要陪学姐去逛街呢. 后来, ...

随机推荐

  1. Vue处理ajax请求

    Ajax请求 1>解决跨域问题 1.1前端解决.只需要在vue.config.js中增加devServer节点增加代理: const path = require("path" ...

  2. React动态import()

    React动态import() react-router@v4代码分离,推荐的import().这里分享webpack配置和使用方法. 首先安装两个必须的包 cnpm i react-loadable ...

  3. 【思维题 状压dp】APC001F - XOR Tree

    可能算是道中规中矩的套路题吧…… Time limit : 2sec / Memory limit : 256MB Problem Statement You are given a tree wit ...

  4. 【Python项目实战】Pandas:让你像写SQL一样做数据分析(一)

    1. 引言 Pandas是一个开源的Python数据分析库.Pandas把结构化数据分为了三类: Series,1维序列,可视作为没有column名的.只有一个column的DataFrame: Da ...

  5. Node项目实战-静态资源服务器

    打开github,在github上创建新项目: Repository name: anydoor Descripotion: Tiny NodeJS Static Web server 选择:publ ...

  6. pandas按索引插入对应值的处理方法 - join

    在工作中遇到一个问题即,实时的车辆数据中,需要将车辆的vid(一个Series)对应上其通用名称,以及车辆用途等信息进行统计. 正常的小规模操作是利用一个循环,查找vid 在另一张vid对应车辆名称用 ...

  7. MySQL迁移升级解决方案

    任务背景 由于现有业务架构已不能满足当前业务需求,在保证数据完整的前提下,现需要将原有数据库迁移到另外一台单独的服务器上,在保证原有服务正常的情况下,将原有LAMP环境中mysql数据库版本5.6.3 ...

  8. LeetCode(200) Number of Islands

    题目 Given a 2d grid map of '1's (land) and '0's (water), count the number of islands. An island is su ...

  9. Linux中同步与异步、阻塞与非阻塞概念以及五种IO模型

    1.概念剖析 相信很多从事linux后台开发工作的都接触过同步&异步.阻塞&非阻塞这样的概念,也相信都曾经产生过误解,比如认为同步就是阻塞.异步就是非阻塞,下面我们先剖析下这几个概念分 ...

  10. webdriver高级应用- 高亮显示正在操作的页面元素

    #encoding=utf-8 import unittest from selenium import webdriver import time def highLightElement(driv ...