BZOJ4276 : [ONTAK2015]Bajtman i Okrągły Robin
2015-09-30 15:52
375 查看
建立线段树,
S向每个叶子连边,容量1,费用0。
孩子向父亲连边,容量inf,费用0。
每个强盗向T连边,容量1,费用为c[i]。
对应区间内的点向每个强盗,容量1,费用0。
求最大费用流即可。
S向每个叶子连边,容量1,费用0。
孩子向父亲连边,容量inf,费用0。
每个强盗向T连边,容量1,费用为c[i]。
对应区间内的点向每个强盗,容量1,费用0。
求最大费用流即可。
#include<cstdio> const int inf=~0U>>2,N=15010,M=1000000; int n,i,A,B,C,ans,cl ,cr ,tot=1;unsigned short l,r; int u[M],v[M],c[M],co[M],nxt[M],t=1,S,T=1,q[65536],g ,f ,d ;bool in ; inline void add(int x,int y,int z,int zo){ u[++t]=x;v[t]=y;c[t]=z;co[t]=zo;nxt[t]=g[x];g[x]=t; u[++t]=y;v[t]=x;c[t]=0;co[t]=-zo;nxt[t]=g[y];g[y]=t; } inline bool spfa(){ int x,i; for(i=1;i<=tot;i++)d[i]=-inf,in[i]=0; d[S]=0;in[S]=1;q[l=r=0]=S; while(l!=r+1){ int x=q[l++]; if(x==T)continue; for(i=g[x];i;i=nxt[i])if(c[i]&&co[i]+d[x]>d[v[i]]){ int y=v[i]; d[y]=co[i]+d[x];f[y]=i; if(!in[y]){ in[y]=1; if(d[y]>d[q[l]])q[--l]=y;else q[++r]=y; } } in[x]=0; } return d[T]>0; } int build(int a,int b){ int x=++tot; if(a==b)return add(S,x,1,0),x; int mid=(a+b)>>1; add(cl[x]=build(a,mid),x,inf,0); add(cr[x]=build(mid+1,b),x,inf,0); return x; } void addedge(int x,int a,int b){ if(A<=a&&b<=B){add(x,tot,1,0);return;} int mid=(a+b)>>1; if(A<=mid)addedge(cl[x],a,mid); if(B>mid)addedge(cr[x],mid+1,b); } int main(){ build(1,4999); for(scanf("%d",&n);n--;addedge(2,1,4999))scanf("%d%d%d",&A,&B,&C),add(++tot,T,1,C),B--; while(spfa())for(ans+=d[T],i=T;i!=S;i=u[f[i]])c[f[i]]--,c[f[i]^1]++; return printf("%d",ans),0; }
相关文章推荐
- Python模拟java输入输出流
- C语言中“指针”和“指针变量”区别及定义
- centos更改时区
- lmis库存预占修改
- Bitmap详解之获取Bitmap的方法
- test
- 设计模式学习笔记--6大设计原则
- 开灯问题
- BZOJ4275 : [ONTAK2015]Badania naukowe
- Android中内容观察者的使用---- ContentObserver类详解
- SSH框架分析之struts深入分析
- supervisord安装,启动/关闭,添加开机自启动服务
- linux python3.4获取股票脚本
- 初试Jni & NDK
- Spring Data JPA 学习记录1 -- 单向1:N关联的一些问题
- DJANGO基础学习之request对象和response对象
- Android环境搭建Appium测试框架 Python
- Linux date命令的用法
- 如何判断ios设备类型
- poj2759(单点更新)