传送门

网络流又一神仙套路应用

首先考虑列不等式,设\(x_i\)为第i种人的个数,记\(b_{i,j}\)为第i种人第j天是否能工作,那么可以列出n个不等式,第j个为\(\sum_{i=1}^{m}b_{i,j}x_i\ge a_j\)

然后将这些不等式转成等式,新开变量y,则那些不等式可以写为$$\begin{cases}b_{1,1}x_1+b_{2,1}x_2...+b_{m,1}x_m=a_1+y_1\b_{1,2}x_1+b_{2,2}x_2...+b_{m,2}x_m=a_2+y_2\......\end{cases}$$

然后每个式子都减去上面的式子(假装最后有一个\(0=0\)的式子),然后得到\(n+1\)个等式.每个等式再移项,使得系数全为正数.我们发现每个变量分别在某个等式左边出现一次,也在某个右边出现一次.所以可以联系网络流是流入流量=流出流量的,这里把每个等式看做一个点,左边看做流入,右边看做流出.对于变量\(x_i\),从流出的点向流入的点连流量为能用的最大次数(本题为Inf),费用为单个代价的边;对于变量\(y_i\),从流出的点向流入的点连流量为能用的最大次数(本题为Inf),费用为0的边;对于常数项\(a_i\),从原点向流入点连流量\(a_i\)费用0边,从流出点向汇点连流量\(a_i\)费用0边,然后费用流求费用就好了

感性理解一下?(

#include<bits/stdc++.h>
#define LL long long
#define il inline
#define re register
#define db double using namespace std;
const int N=1e4+10,M=1e5+10;
il int rd()
{
int x=0,w=1;char ch=0;
while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
int n,m;
int a[N],b[N][3];
int ps,pt,to[M],nt[M],c[M],hd[N],tot=1;
LL w[M];
il void add(int x,int y,int z,int zz)
{
++tot,to[tot]=y,nt[tot]=hd[x],c[tot]=z,w[tot]= zz,hd[x]=tot;
++tot,to[tot]=x,nt[tot]=hd[y],c[tot]=0,w[tot]=-zz,hd[y]=tot;
}
LL di[N],ans;
int pre[N],fw[N];
bool v[N];
queue<int> q;
il bool csfl()
{
memset(di,0x3f3f3f,sizeof(di));
memset(fw,0,sizeof(fw));
di[ps]=0,fw[ps]=1<<30,v[ps]=1,q.push(ps);
while(!q.empty())
{
int x=q.front();
q.pop();
for(int i=hd[x];i;i=nt[i])
{
int y=to[i];
if(c[i]>0&&di[y]>di[x]+w[i])
{
di[y]=di[x]+w[i];
pre[y]=i,fw[y]=min(fw[x],c[i]);
if(!v[y]) v[y]=1,q.push(y);
}
}
v[x]=0;
}
if(di[pt]==di[pt+1]) return 0;
ans+=1ll*di[pt]*fw[pt];
int x=pt;
while(x^ps)
{
int i=pre[x];
c[i]-=fw[pt],c[i^1]+=fw[pt];
x=to[i^1];
}
return 1;
} int main()
{
n=rd(),m=rd();
for(int i=1;i<=n;++i) a[i]=rd();
for(int i=1;i<=m;++i) b[i][0]=rd(),b[i][1]=rd(),b[i][2]=rd();
ps=0,pt=n+3;
for(int i=1;i<=m;++i) add(b[i][1]+1,b[i][0],1<<30,b[i][2]);
for(int i=1;i<=n;++i) add(i,i+1,1<<30,0);
for(int i=1;i<=n;++i) add(ps,i+1,a[i],0),add(i,pt,a[i],0);
while(csfl());
printf("%lld\n",ans);
return 0;
}

luogu P3980 [NOI2008]志愿者招募的更多相关文章

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

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

  2. P3980 [NOI2008]志愿者招募 费用流 (人有多大胆地有多大产

    https://www.luogu.org/problemnew/show/P3980 感觉费用流比网络流的图更难想到,要更大胆.首先由于日期是连续的,所以图中的点是横向排列的. 这道题有点绕道走的意 ...

  3. P3980 [NOI2008]志愿者招募

    思路 巧妙的建图 因为每个志愿者有工作的时段,所以考虑让一个志愿者的流量能够从S流到T产生贡献 所以每个i向i+1连INF-a[x]的边(类似于k可重区间集),每个si向ti连边cap=INF,cos ...

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

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

  5. P3980 [NOI2008]志愿者招募 (费用流)

    题意:最多1000天 每天需要至少ai个工人施工 有10000种工人可以雇佣 每种工人可以工作si到ti天 雇佣一个的花费是ci 问怎样安排使得施工花费最少 思考:最直白的建模方式 就是每种工人可以和 ...

  6. BZOJ 1061: [Noi2008]志愿者招募

    1061: [Noi2008]志愿者招募 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 4064  Solved: 2476[Submit][Stat ...

  7. BZOJ 1061: [Noi2008]志愿者招募 [单纯形法]【学习笔记】

    1061: [Noi2008]志愿者招募 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 3975  Solved: 2421[Submit][Stat ...

  8. [BZOJ1061][Noi2008]志愿者招募

    [BZOJ1061][Noi2008]志愿者招募 试题描述 申奥成功后,布布经过不懈努力,终于成为奥组委下属公司人力资源部门的主管.布布刚上任就遇到了一个难 题:为即将启动的奥运新项目招募一批短期志愿 ...

  9. BZOJ 1061: [Noi2008]志愿者招募 费用流

    1061: [Noi2008]志愿者招募 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=1061 Description 申奥成功后,布布 ...

随机推荐

  1. 【ZJOI2007】粒子运动

    若此段起始点为(stx,sty),速度为(vx,vy),设碰撞时间为t,则(stx+vx·t)²+(sty+vy·t)²=r² → stx²+vx²·t²+2·stx·vx·t+sty²+vy²·t² ...

  2. java ssl 使用不同的加密套件,对性能影响很大

    一直以来都是使用java默认的[加密套件]来处理ssl请求,突然有一天我尝试显式的设置了一组加密套件后,发现图片显示的速度明显快了一倍左右. 经过使用几组不同的加密套件测试后,发现使用 TLS_ECD ...

  3. HTML学习笔记Day1

    一.网站建设流程 1.注册域名(网址) 2.租用空间(服务器) 3.网站建设 (1)确定网站主题(项目) (2)搜集材料(项目) (3)规划网站(UI) (4)制作页面(前端--后端) 4.网络推广 ...

  4. (Dijkstra) POJ2387 Til the Cows Come Home

    Til the Cows Come Home Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 81024   Accepted ...

  5. 【矢量绘图工具】Adobe Illustrator (AI) CC 2019 for Mac 23.0

    以上图片来源于互联网分享,如涉及版权问题请联系作者删除. 文章素材来源:风云社区(www.scoee.com) 下载地址:风云社区(www.scoee.com)   [简介] Adobe illust ...

  6. Linux truncate的使用方法介绍

    Linux truncate的使用方法介绍 参考资料:https://www.fengbohello.top/archives/linux-truncate 本命令缩减或扩充指定文件的大小为指定值.参 ...

  7. nginx配置打印请求响应内容

    #放在http{}里面 log_format kyh ' [$time_local] "$request" $status \n' 'req_header:"$req_h ...

  8. C++中string、char *、char[]的转换

    头段时间有人问过我这个问题,可是我一点头绪都没有,直接说不会.现在从网上找了点资料,看了看,知道点东西了. 一.string转char*. 主要有三种方法可以将str转换为char*类型,分别是:da ...

  9. 解决pycharm问题:module 'pip' has no attribute 'main'

    问题 更新pip之后,Pycharm安装package出现如下报错: 解决 找到安装目录下 helpers/packaging_tool.py文件,找到如下代码: 修改为如下,保存即可.

  10. Jquery 添加插件

    原文:http://www.iteye.com/topic/545971 jQuery插件的开发包括两种: 一种是类级别的插件开发,即给jQuery添加新的全局函数,相当于给jQuery类本身添加方法 ...