[NOI2008] [bzoj1061] 志愿者招募
还是一道费用流的题目。话不多说,进入正题。
题意:给定n个点和m种从l到r覆盖一层的费用,求满足所有点的覆盖层数都大等于权值的最小费用
分析:要做到区间修改,看似比较麻烦。
用差分把区间修改变成单点修改(左端+,右端-)
那么建一种边,从右端+1的位置流向左端点的位置,花费为c
然后有可能覆盖层数过大,我们建一种边使满足单点层数-1花费为0,使最后的覆盖结果一定是与要求的一致
最后就是建源到某个点的流量剩余(或这个点到汇的流量需求)
下面贴上代码:
#include<cstdio>
using namespace std;
const int inf=;
int n,m;
int tot=,mx,q[],d[],pree[],h[];
struct edge{int to,nxt,cst,cap;}e[];
bool vis[];
int mn(int x,int y){return x>y?y:x;}
void add(int fr,int to,int cst,int cap)
{
e[++tot]={to,h[fr],cst,cap};h[fr]=tot;
e[++tot]={fr,h[to],-cst,};h[to]=tot;
}
void init()
{
scanf("%d%d",&n,&m);
int now,lst=;
for(int i=;i<=n;i++)
{
scanf("%d",&now);
int cst=now-lst;lst=now;
if(cst>)add(i,n+,,cst),mx+=cst;//差分建图
else add(,i,,-cst);
add(i,i+,,inf);//单点减1答案不变
}
add(,n+,,lst);
for(int i=;i<=m;i++)
{
int l,r,c;
scanf("%d%d%d",&l,&r,&c);
add(r+,l,c,inf);//区间加法头加尾减
}
n+=;
}
bool spfa()
{
for(int i=;i<=n;i++)d[i]=inf;
int l=,r=;q[]=;vis[]=;
while(l!=r)
{
int x=q[l=l==n?:l+];
for(int i=h[x];i;i=e[i].nxt)
if(e[i].cap&&e[i].cst+d[x]<d[e[i].to])
{
int v=e[i].to;
pree[v]=i;
d[v]=d[x]+e[i].cst;
if(!vis[v])
{
if(d[v]>d[l+])q[r=r==n?:r+]=v;
else q[l]=v,l=l==?n:l-;
vis[v]=;
}
}
vis[x]=;
}
return d[n]==inf?:;
}
int costflow()
{
int cost=,mm=;
while(spfa())
{
int mi=inf;
for(int i=n;i;i=e[pree[i]^].to)
mi=mn(mi,e[pree[i]].cap);
for(int i=n;i;i=e[pree[i]^].to)
{
int ee=pree[i];
e[ee].cap-=mi;
e[ee^].cap+=mi;
}
cost+=d[n]*mi;
mm+=mi;
}
return mm==mx?cost:;
}
int main()
{
init();
printf("%d",costflow());
return ;
}
[NOI2008] [bzoj1061] 志愿者招募的更多相关文章
- [NOI2008][bzoj1061] 志愿者招募 [费用流+巧妙的建图]
题面 传送门 思路 引入:网络流? 看到这道题,第一想法是用一个dp来完成决策 但是,显然这道题的数据并不允许我们进行dp,尤其是有10000种志愿者的情况下 那么我们就要想别的办法来解决: 贪心?这 ...
- 【BZOJ1061】【NOI2008】志愿者招募
[BZOJ1061][NOI2008]志愿者招募 题面 BZOJ 题解 我们设每类志愿者分别招募了\(B[i]\)个 那么,我们可以得到一系列的方程 \[\sum_{S[i]\leq x\leq T[ ...
- bzoj1061 志愿者招募
bzoj1061 志愿者招募 Description 申奥成功后,布布经过不懈努力,终于成为奥组委下属公司人力资源部门的主管.布布刚上任就遇到了一个难 题:为即将启动的奥运新项目招募一批短期志愿者.经 ...
- 【NOI2008】志愿者招募
[NOI2008]志愿者招募 和[2017山东day7]养猫做法类似. 都是神仙题. 首先我设\(c_{i,j}=[l[j]\leq i\leq r[j]]\) ,于是就可以列出下面的不等式: \[ ...
- bzoj1061【NOI2008】志愿者招募
1061: [Noi2008]志愿者招募 Time Limit: 20 Sec Memory Limit: 162 MB Submit: 2740 Solved: 1703 [Submit][id ...
- BZOJ-1061 志愿者招募 线性规划转最小费用最大流+数学模型 建模
本来一眼建模,以为傻逼题,然后发现自己傻逼...根本没想到神奇的数学模型..... 1061: [Noi2008]志愿者招募 Time Limit: 20 Sec Memory Limit: 162 ...
- 【BZOJ】【1061】【NOI2008】志愿者招募
网络流/费用流 OrzOrzOrz,这题太神了不会捉. 题解:https://www.byvoid.com/blog/noi-2008-employee/ 这道题正确的解法是构造网络,求网络最小费用最 ...
- bzoj [Noi2008] 1061 志愿者招募 单纯形
[Noi2008]志愿者招募 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 5437 Solved: 3267[Submit][Status][Di ...
- 【网络流】【BZOJ1061】【NOI2008】志愿者招募
原题链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1061 题意:问你如何购买志愿者使得满足题意的总费用最小. 解题思路:首先,由于志愿者存在的 ...
随机推荐
- Android 多屏幕适配 dp和px的关系 最好用dp
Android 多屏幕适配 dp和px的关系 一直以来别人经常问我,android的多屏幕适配到底是怎么弄,我也不知道如何讲解清楚,或许自己也是挺迷糊. 以下得出的结论主要是结合官方文档进行分析的ht ...
- [C/C++] 原码、反码、补码问题
正确答案:D 解析: C语言中变量以补码形式存放在内存中,正数的补码与原码相同,负数求补码方式为(符号位不变,其余各位取反,最后末尾加1): 32位机器:int 32位,short 16位. x = ...
- 【python】Python 之 __new__() 方法与实例化
本文转自:http://www.cnblogs.com/ifantastic/p/3175735.html __new__() 是在新式类中新出现的方法,它作用在构造方法建造实例之前,可以这么理解,在 ...
- 第70天:jQuery基本选择器(一)
一.jQuery基本选择器 jQuery是javascript的一个库,包含多个可重用的函数,用来辅助我们简化javascript开发 jQuery能做的javascipt都能做到,而javascri ...
- 新jQuery中attr 与 prop的不同
使用最新版本jquery,在对checkbox操作时发现 attr属性全选,反选等不起作用,后查发现新版本对标签属性的设置发生了变化. 在高版本的jquery引入prop方法后,什么时候该用prop? ...
- BZOJ 1221 软件开发(费用流)
容易看出这是显然的费用流模型. 把每天需要的餐巾数作为限制.需要将天数拆点,x’表示每天需要的餐巾,x’’表示每天用完的餐巾.所以加边 (s,x',INF,0),(x'',t,INF,0). 餐巾可以 ...
- Python Collections详解
Python Collections详解 collections模块在内置数据结构(list.tuple.dict.set)的基础上,提供了几个额外的数据结构:ChainMap.Counter.deq ...
- hdu 1596 find the safest road (最短路径)
find the safest road Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- [洛谷P2057][SHOI2007]善意的投票
题目大意:有$n(n\leqslant300)$个人,每个人可以选择$0$或$1$,每个人最开始有意愿,有$m(m\leqslant\dfrac{n(n-1)}2)$对好朋友.定义一次的冲突数为好朋友 ...
- [TJOI2013]最长上升子序列 平衡树
其实是一道性质题. 首先观察到插入的数是递增的, 那么根据上升子序列的性质, 我们的非法情况就是统计到了在一个数前面的后插入的数, 但是由于插入的数是递增的,显然插入这个数后,这个数就是最大的,所以除 ...