\(\mathcal{Description}\)

  Link.

  一项持续 \(n\) 天的任务,第 \(i\) 天需要至少 \(a_i\) 人工作。还有 \(m\) 种雇佣方式,第 \(i\) 种每雇佣一人代价为 \(c_i\),此人会从第 \(s_i\) 天工作到第 \(t_i\) 天(包括边界)。求满足条件的最小代价和。

  \(n\le10^3\),\(m\le10^4\)。

\(\mathcal{Solution}\)

  非常巧妙地题意转化。

  初始时刻,有 \(+\infty\) 人待业,限制第 \(i\) 天至多 \(+\infty-a_i\) 人待业(那么至少就有 \(a_i\) 人上工)。雇佣一个人相当于用 \(c_i\) 的费用让一个人从 \(s_i\) 天起上工,到 \(t_i+1\) 天恢复待业状态。所以最小费用最大流建图为:

  • \(i\rightarrow i+1\),流量 \(+\infty-a_i\),费用为 \(0\);
  • \(s_i\rightarrow t_i+1\)(建一个虚点 \(T=n+1\)),流量 \(+\infty\),费用 \(c_i\)。

  跑最小费用最大流即可。复杂度 \(\mathcal O(\operatorname{Dinic}(n,n+m))\)。

\(\mathcal{Code}\)

/* Clearink */

#include <queue>
#include <cstdio> typedef long long LL;
typedef std::pair<LL, LL> PLL; const int MAXN = 1e3, MAXM = 1e4;
const LL INF = 1ll << 60;
int n, m; inline LL imin ( const LL a, const LL b ) { return a < b ? a : b; } // 这个 MFCG 其实是错的,SPFA d[i] 应初始化为 INF 而非 -1.
struct MaxFlowCostGraph {
static const int MAXND = MAXN + 2, MAXEG = MAXN + MAXM + 1;
int ecnt, head[MAXND + 5], S, T, bound, curh[MAXND + 5];
LL d[MAXND + 5];
bool inq[MAXND + 5];
struct Edge { int to; LL flw; int cst, nxt; } graph[MAXEG * 2 + 5]; MaxFlowCostGraph (): ecnt ( 1 ) {} inline void link ( const int s, const int t, const LL f, const int w ) {
graph[++ecnt] = { t, f, w, head[s] };
head[s] = ecnt;
} inline Edge& operator [] ( const int k ) { return graph[k]; } inline void operator () ( const int s, const int t, const LL f, const int w ) {
#ifdef RYBY
printf ( "%d %d ", s, t );
if ( f == INF ) printf ( "INF " );
else printf ( "%lld ", f );
printf ( "%d\n", w );
#endif
link ( s, t, f, w ), link ( t, s, 0, -w );
} inline bool spfa () {
static std::queue<int> que;
for ( int i = 0; i <= bound; ++i ) d[i] = -1, inq[i] = false;
d[S] = 0, inq[S] = true, que.push ( S );
while ( !que.empty () ) {
int u = que.front (); que.pop ();
inq[u] = false;
for ( int i = head[u], v; i; i = graph[i].nxt ) {
if ( graph[i].flw
&& ( !~d[v = graph[i].to] || d[v] > d[u] + graph[i].cst ) ) {
d[v] = d[u] + graph[i].cst;
if ( !inq[v] ) que.push ( v ), inq[v] = true;
}
}
}
return ~d[T];
} inline PLL dfs ( const int u, const LL iflw ) {
if ( u == T ) return { iflw, 0 };
inq[u] = true; PLL ret ( 0, 0 );
for ( int& i = curh[u], v; i; i = graph[i].nxt ) {
if ( graph[i].flw && !inq[v = graph[i].to]
&& d[v] == d[u] + graph[i].cst ) {
PLL oflw ( dfs ( v, imin ( iflw - ret.first, graph[i].flw ) ) );
graph[i].flw -= oflw.first, graph[i ^ 1].flw += oflw.first;
ret.first += oflw.first;
ret.second += graph[i].cst * oflw.first + oflw.second;
if ( ret.first == iflw ) break;
}
}
if ( !ret.first ) d[u] = -1;
return inq[u] = false, ret;
} inline PLL calc ( const int s, const int t ) {
S = s, T = t;
PLL ret ( 0, 0 );
while ( spfa () ) {
for ( int i = 0; i <= bound; ++i ) inq[i] = false, curh[i] = head[i];
PLL tmp ( dfs ( S, INF ) );
ret.first += tmp.first, ret.second += tmp.second;
}
return ret;
}
} graph; int main () {
scanf ( "%d %d", &n, &m );
int S = 0, T = graph.bound = n + 1;
graph ( S, 1, INF, 0 );
for ( int i = 1, a; i <= n; ++i ) {
scanf ( "%d", &a );
graph ( i, i + 1, INF - a, 0 );
}
for ( int i = 1, s, t, c; i <= m; ++i ) {
scanf ( "%d %d %d", &s, &t, &c );
graph ( s, t + 1, INF, c );
}
printf ( "%lld\n", graph.calc ( S, T ).second );
return 0;
}

Solution -「NOI 2008」「洛谷 P3980」志愿者招募的更多相关文章

  1. 洛谷P3980 [NOI2008]志愿者招募

    题解 最小费用最大流 每一天是一条边\((inf-a[i], 0)\) 然后对于一类志愿者, 区间两端连一条\((inf, c[i])\) \(S\)向第一个点连\((inf, 0)\) 最后一个点向 ...

  2. 「区间DP」「洛谷P1043」数字游戏

    「洛谷P1043」数字游戏 日后再写 代码 /*#!/bin/sh dir=$GEDIT_CURRENT_DOCUMENT_DIR name=$GEDIT_CURRENT_DOCUMENT_NAME ...

  3. 【洛谷】P3980 [NOI2008]志愿者招募

    [洛谷]P3980 [NOI2008]志愿者招募 我居然现在才会用费用流解线性规划-- 当然这里解决的一类问题比较特殊 以式子作为点,变量作为边,然后要求就是变量在不同的式子里出现了两次,系数一次为+ ...

  4. Solution -「JSOI 2019」「洛谷 P5334」节日庆典

    \(\mathscr{Description}\)   Link.   给定字符串 \(S\),求 \(S\) 的每个前缀的最小表示法起始下标(若有多个,取最小的).   \(|S|\le3\time ...

  5. Solution -「洛谷 P4372」Out of Sorts P

    \(\mathcal{Description}\)   OurOJ & 洛谷 P4372(几乎一致)   设计一个排序算法,设现在对 \(\{a_n\}\) 中 \([l,r]\) 内的元素排 ...

  6. Solution -「POI 2010」「洛谷 P3511」MOS-Bridges

    \(\mathcal{Description}\)   Link.(洛谷上这翻译真的一言难尽呐.   给定一个 \(n\) 个点 \(m\) 条边的无向图,一条边 \((u,v,a,b)\) 表示从 ...

  7. Solution -「APIO 2016」「洛谷 P3643」划艇

    \(\mathcal{Description}\)   Link & 双倍经验.   给定 \(n\) 个区间 \([a_i,b_i)\)(注意原题是闭区间,这里只为方便后文描述),求 \(\ ...

  8. 「洛谷 P1801」黑匣子

    好像很久没有更过博客了,因为博主这几周很忙.其实是在搞颓. 题意很难懂,所以就不重复了.其实是懒. 一眼看上去这是个 \(Splay\) 裸题,直接插入一个数,查询区间第 \(K\) 大,但是这样太不 ...

  9. 「洛谷4197」「BZOJ3545」peak【线段树合并】

    题目链接 [洛谷] [BZOJ]没有权限号嘤嘤嘤.题号:3545 题解 窝不会克鲁斯卡尔重构树怎么办??? 可以离线乱搞. 我们将所有的操作全都存下来. 为了解决小于等于\(x\)的操作,那么我们按照 ...

随机推荐

  1. Educational Codeforces Round 117 (Rated for Div. 2)

    Educational Codeforces Round 117 (Rated for Div. 2) A. Distance https://codeforces.com/contest/1612/ ...

  2. Redis 应用问题

    Redis 应用问题 1.缓存穿透 1.1.问题概述 key 对应的数据在数据源中不存在,每次针对此 key 的请求从缓存获取不到,请求都会压到数据源(也就是不断的去查数据库,从而使得数据库系统崩溃) ...

  3. sql创建表格时出现乱码

    1.新建数据库时,第一次只填写了数据库名称保存数据库,如下图: 2.创建一个Student表格,代码如下,其中有数据有中文,创建完后查看表格数据,发现中文为乱码 create table Studen ...

  4. 最新RabbitMQ安装指南2021.07

    一.RabbitMQ入门及安装 1.入门及安装 01 概述 简单概述: RabbitMQ是一个开源的遵循 AMQP协议实现的基于 Erlang语言编写,支持多种客户端(语言),用于在分布式系统中存储消 ...

  5. Java中:接口,抽象类,内部类

    Java8中的接口 public interface Output { //接口里定义的成员变量只能是常量 //默认使用public static final修饰 int MAX_CACHE_LINE ...

  6. 【数据结构与算法】蓄水池抽样算法(Reservoir Sampling)

    问题描述 给定一个数据流,数据流长度 N 很大,且 N 直到处理完所有数据之前都不可知,请问如何在只遍历一遍数据(O(N))的情况下,能够随机选取出 m 个不重复的数据. 比较直接的想法是利用随机数算 ...

  7. .NET 云原生架构师训练营(KestrelServer源码分析)--学习笔记

    目录 目标 源码 目标 理解 KestrelServer 如何接收网络请求,网络请求如何转换成 http request context(C# 可识别) 源码 https://github.com/d ...

  8. Jquery操作文本内容(三个方法:html()、text()、var())

    Jquery操作文本内容(三个方法:html().text().var()) 一.html()获取和设置文本内容和标签 1.获取标签里的结构和内容 $("ul").html() / ...

  9. window10教育版激活失败

    问题 输入完key之后显示无法连接服务器 再次输入密钥无效,而且家庭版密钥激活也没了 使用命令行消除过去的key,使用新的教育版key后,显示运行在运行microsoft windows 非核心版本的 ...

  10. Cesium入门5 - Cesium ion

    Cesium入门5 - Cesium ion Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ Cesium io ...