【NOI2008】志愿者招募
【NOI2008】志愿者招募
和【2017山东day7】养猫做法类似。
都是神仙题。
首先我设\(c_{i,j}=[l[j]\leq i\leq r[j]]\) ,于是就可以列出下面的不等式:
\begin{align}
\sum_{i=1}^mc_{1,i}*d_i&\geq a_1\\
&...\\
\sum_{i=1}^mc_{n,i}*d_i&\geq a_n\\
0&=0
\end{align}
\]
我们加一个辅助变量\(y_i\),使不等式变成等式,并且在最后加上\(0=0\):
\begin{align}
\sum_{i=1}^mc_{1,i}*d_i&=y_1+a_1\\
&...\\
\sum_{i=1}^mc_{n,i}*d_i&=y_n+a_n\\
0&=0
\end{align}
\]
差分后:
\displaystyle
\sum_{i=1}^mc_{1,i}*d_i&=y_1+a_1\\
\sum_{i=1}^mc_{2,i}*d_i+y_1+a_1&=\sum_{i=1}^mc_{1,i}*d_i+y_2+a_2\\
&...\\
\sum_{i=1}^mc_{n,i}*d_i+y_{n-1}+a_{n-1}
&=\sum_{i=1}^mc_{n-1,i}*d_i+y_n+a_n\\
y_n+a_n&=\sum_{i=1}^mc_{n,i}*d_i
\end{align}
\]
然后每个变量就会在等式左边和右边各出现一次。对于一个变量\(x\),我们从它出现于右边的等式连一条边到它出现于左边的等式。对于常量,它出现在左边就从\(S\)连一条边到该等式,否则该等式连一条边到\(T\)。
代码:
#include<bits/stdc++.h>
#define ll long long
#define N 2005
#define M 20005
using namespace std;
inline int Get() {int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}while('0'<=ch&&ch<='9') {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;}
int n,m;
int S,T;
int l[M],r[M],c[M];
int a[N];
struct road {
int to,next;
int flow;
ll cost;
}s[(N+M)*5];
int h[N],cnt=1;
void add(int i,int j,int f,ll c) {
s[++cnt]=(road) {j,h[i],f,c};h[i]=cnt;
s[++cnt]=(road) {i,h[j],0,-c};h[j]=cnt;
}
ll ans=0;
ll tag[N];
ll lim[N];
ll dis[N];
int fr[N],e[N];
bool in[N];
queue<int>q;
int tot;
int maxflow;
bool ins[N];
int dfs(int v,int maxf) {
if(v==T) return maxf;
ins[v]=1;
int ret=0;
for(int i=h[v];i;i=s[i].next) {
int to=s[i].to;
if(!ins[to]&&s[i].flow&&dis[to]==dis[v]+s[i].cost) {
int dlt=dfs(to,min(maxf,s[i].flow));
ret+=dlt;
s[i].flow-=dlt;
s[i^1].flow+=dlt;
maxf-=dlt;
if(!maxf) return ins[v]=0,ret;
}
}
ins[v]=0;
return ret;
}
ll dinic() {
ll ans=0;
while(1) {
int tem=dfs(S,1e9);
if(!tem) break;
ans+=tem;
}
return ans;
}
bool spfa() {
memset(dis,0x3f,sizeof(dis));
dis[S]=0;
q.push(S);
while(!q.empty()) {
int v=q.front();
q.pop();
in[v]=0;
for(int i=h[v];i;i=s[i].next) {
int to=s[i].to;
if(s[i].flow&&dis[to]>dis[v]+s[i].cost) {
dis[to]=dis[v]+s[i].cost;
fr[to]=v;
e[to]=i;
if(!in[to]) in[to]=1,q.push(to);
}
}
}
if(dis[T]>1e9) return 0;
ans+=dinic()*dis[T];
return 1;
}
int main() {
n=Get(),m=Get();
for(int i=1;i<=n;i++) a[i]=Get();
for(int i=1;i<=m;i++) l[i]=Get(),r[i]=Get(),c[i]=Get();
T=n+2;
for(int i=1;i<=n;i++) {
add(i,T,a[i],0);
add(S,i+1,a[i],0);
add(i,i+1,1e9,0);
}
for(int i=1;i<=m;i++) {
add(r[i]+1,l[i],1e9,c[i]);
}
while(spfa());
cout<<ans;
return 0;
}
【NOI2008】志愿者招募的更多相关文章
- BZOJ 1061: [Noi2008]志愿者招募
1061: [Noi2008]志愿者招募 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 4064 Solved: 2476[Submit][Stat ...
- BZOJ 1061: [Noi2008]志愿者招募 [单纯形法]【学习笔记】
1061: [Noi2008]志愿者招募 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 3975 Solved: 2421[Submit][Stat ...
- [BZOJ1061][Noi2008]志愿者招募
[BZOJ1061][Noi2008]志愿者招募 试题描述 申奥成功后,布布经过不懈努力,终于成为奥组委下属公司人力资源部门的主管.布布刚上任就遇到了一个难 题:为即将启动的奥运新项目招募一批短期志愿 ...
- BZOJ 1061: [Noi2008]志愿者招募 费用流
1061: [Noi2008]志愿者招募 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=1061 Description 申奥成功后,布布 ...
- bzoj1061: [Noi2008]志愿者招募
线性规划与费用流.http://www.cnblogs.com/iiyiyi/p/5616080.html.数组范围开错了!!!然后2.31-1=0x7fffffff!=0x7f7f7f7f. 开始以 ...
- NOI2008 志愿者招募
1061: [Noi2008]志愿者招募 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 1859 Solved: 1169[Submit][Stat ...
- 线性规划||网络流(费用流):COGS 288. [NOI2008] 志愿者招募
[NOI2008] 志愿者招募 输入文件:employee.in 输出文件:employee.out 简单对比 时间限制:2 s 内存限制:512 MB [问题描述] 申奥成功后,布布经过 ...
- 从[NOI2008志愿者招募]浅谈线性规划在网络流构图上的巧用
首先来看一下题..http://www.lydsy.com/JudgeOnline/problem.php?id=1061 1061: [Noi2008]志愿者招募 Description 申奥成功后 ...
- 【费用流】BZOJ1061: [Noi2008]志愿者招募(这题超好)
1061: [Noi2008]志愿者招募 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 5291 Solved: 3173[Submit][Stat ...
- BZOJ 1061: [Noi2008]志愿者招募【单纯形裸题】
1061: [Noi2008]志愿者招募 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 4813 Solved: 2877[Submit][Stat ...
随机推荐
- MVC5 Controller构造方法获取User为空解决方法
用如下方法获取UserId报空引用异常 public class BaseController : Controller { protected SiteContext db = new SiteCo ...
- .NET MVC JSON JavaScriptSerializer 字符串的长度超过 maxJsonLength 值问题的解决
[ArgumentException: 使用 JSON JavaScriptSerializer 序列化或还原序列化期间发生错误.字符串的长度超过在 maxJsonLength 属性上设定的值. 参数 ...
- 谈谈mysql的悲观和乐观锁
悲观锁与乐观锁是两种常见的资源并发锁设计思路,也是并发编程中一个非常基础的概念.之前有写过一篇文章关于并发的处理思路和解决方案,这里我单独将对这两种常见的锁机制在数据库数据上的实现进行比较系统的介绍一 ...
- jdk的配置(适用于win7、win8、win10)
一.前言 win7和win8的jdk配置基本一样,所以本文以win7和win10来说明配置. 二.win7jdk环境配置(win8和这个一样) 首先安装好jdk,这里已安装好jdk7,本文采取的是jd ...
- js 判断数组中的值是否都相等
function isAllEqual(array) { if (array.length > 0) { return !array.some(function(value, index) { ...
- 洛谷P3246 [HNOI2016]序列(离线 差分 树状数组)
题意 题目链接 Sol 好像搞出了一个和题解不一样的做法(然而我考场上没写出来还是爆零0) 一个很显然的思路是考虑每个最小值的贡献. 预处理出每个数左边第一个比他小的数,右边第一个比他大的数. 那么\ ...
- Python 关于xpath查找XML元素的一点总结
关于xpath查找XML元素的一点总结 by:授客 QQ:1033553122 欢迎加入全国软件测试qq群:7156436 测试环境 Win7 64 python 3.4.0 实践出真知 代码 ...
- html:常见行内标签,常见块级标签,常见自闭合标签
本文内容: 常见行内标签 常见块级标签 常见自闭合标签 首发日期:2018-02-12 修改: 2018-04-25:删除了不常用的标签 常见行内标签: 什么是行内标签: 行内标签就是在页面内只占据刚 ...
- Python sax模块(SAX解析XML)
XML样例: <?xml version="1.0"?> <collection shelf="New Arrivals"> <m ...
- Linux中安装硬盘后对硬盘的分区以及挂载
我将使用VM来进行模拟 先使用df看下我的电脑硬盘信息: df -h 可以看到只有一个sda1分区装载/boot,还有一个扩展分区 查看dev下的硬盘: 只有一个硬盘(两个分区) 注意: 如果你是ID ...