【NOI2008】志愿者招募

【2017山东day7】养猫做法类似。

都是神仙题。

首先我设\(c_{i,j}=[l[j]\leq i\leq r[j]]\) ,于是就可以列出下面的不等式:

\[\displaystyle
\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\):

\[\displaystyle
\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}
\]

差分后:

\[\begin{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】志愿者招募的更多相关文章

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

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

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

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

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

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

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

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

  5. bzoj1061: [Noi2008]志愿者招募

    线性规划与费用流.http://www.cnblogs.com/iiyiyi/p/5616080.html.数组范围开错了!!!然后2.31-1=0x7fffffff!=0x7f7f7f7f. 开始以 ...

  6. NOI2008 志愿者招募

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

  7. 线性规划||网络流(费用流):COGS 288. [NOI2008] 志愿者招募

    [NOI2008] 志愿者招募 输入文件:employee.in   输出文件:employee.out   简单对比 时间限制:2 s   内存限制:512 MB [问题描述] 申奥成功后,布布经过 ...

  8. 从[NOI2008志愿者招募]浅谈线性规划在网络流构图上的巧用

    首先来看一下题..http://www.lydsy.com/JudgeOnline/problem.php?id=1061 1061: [Noi2008]志愿者招募 Description 申奥成功后 ...

  9. 【费用流】BZOJ1061: [Noi2008]志愿者招募(这题超好)

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

  10. BZOJ 1061: [Noi2008]志愿者招募【单纯形裸题】

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

随机推荐

  1. 推荐写作平台gitbook——让我们换一种形式写作

    https://www.gitbook.com/ 我一直用这个平台进行写作.目前有两本电子书可以供大家阅读,分别如下 Office 365 开发入门指南 https://www.gitbook.com ...

  2. 无法将文件“..\bin\Debug \**.dll”复制到“bin\**.dll”。对路径“bin \**.dll”的访问被拒绝。

    1.方法一: 将bin的只读属性去掉,就OK. 2.方法二: 直接关掉项目,重新打开.

  3. Linux服务器评测脚本 中文IO脚本简单易懂

    中文版: wget -N --no-check-certificate https://raw.githubusercontent.com/FunctionClub/ZBench/master/ZBe ...

  4. Tomcat服务器为java项目配置顶级域名

    修改端口, Tomcat服务器下conf/server.xml文件      把端口号更改为80 解释:输入域名时默认进入80端口,如果没修改则需要输入端口号才能进入. Eg:www.xxx.com: ...

  5. Docker 系列一(概念原理和安装).

    一.概念原理 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间 ...

  6. 在Java中进行序列化和反序列化

    对象序列化的目标是将对象保存在磁盘中,或者允许在网络中直接传输对象. 对象序列化允许把内存中的Java对象转换成平台无关的二进制流,从而允许把这种二进制流持久保存在磁盘上或者通过网络将这种二进制流传输 ...

  7. 用GitHub Issue取代多说,是不是很厉害?

    摘要: 别了,多说,拥抱Gitment. 2017年6月1日,多说正式下线,这多少让人感觉有些遗憾.在比较了多个博客评论系统,我最终选择了Gitment作为本站的博客评论系统: UI简洁,适合我的博客 ...

  8. 解决PHP Redis扩展无法加载的问题(zend_new_interned_string in Unknown on line 0)

    出错代码如下 PHP Warning: PHP Startup: Unable to load 最近在工作中需要使用PHP访问Redis,从https://github.com/phpredis/ph ...

  9. mac gulp: command not found

    mac下执行gulp的时候报错:gulp: command not found 1.查看npm的安装目录 npm root 2.如果不是/usr/local , 说明未全局安装,执行 sudo npm ...

  10. gulp插件构建项目 压缩js、css、image、zip、web服务、跨域等插件

    推荐一个很好文: https://github.com/lin-xin/blog/issues/2 匹配符 *.**.!.{} gulp.src('./js/*.js') // * 匹配js文件夹下所 ...