当前位置: 首页 > news >繁体>【BZOJ3218】 a+b Problem

【BZOJ3218】 a+b Problem


 

Solution

  看一下如何建最小割模型:

  先求$sum=\sum b_i+w_i$。

  如果某一个格子$i$选择了黑色,那么贡献是$-w_i$;如果满足是它奇怪的格子,还有额外贡献$-p_i$。

  如果选择了白色,那么贡献是$-b_i$。

  总贡献加上$sum$就是答案。

 

  对于如上条件,可以对每一个格子建立一个单元:

    

  可以发现,如果选择白色,那么直接割去$b[i]$这条边。那么要怎么影响之后的黑格呢?

  对于每一个点$i$,对于所有的$j>i$,使得$i$按题目要求可以使$j$成为奇怪的格子,那么由$i$向$j'$连一条$\infty$的边。

  如果第$i$个格子选择白色,那么对$j$的单元来说,必须割掉$p[j]$这条边,加上原本一定要割的$w[j]$,就是$j$成为奇怪格子的贡献。 

  由此建模完成。

 

  但是边数高达$O(n^2)$

  看看题目的要求是$i<j$,也就是说对于格子$i$,在$1...i-1$的范围内找权值为$[l_i,r_i]$的格子,对单元进行连接。

  看起来好像主席树啊,那就关于$a_i$建权值主席树吧。

  类似线段树优化网络流建边地,往主席树插入第$i$个格子的时候,将$i$(单元里面的那个$i$点)连向新链上每一个新节点,再由原节点连向新节点,流量都是$\infty$。

  注意不能像平时用线段树跑网络流一样在叶子底部连接,然后从儿子往父亲流。因为这样会出现版本的冲突。

  跑一下就好了。

  PS:边的计数器忘记初始化调了整整一个上午服了。。。

  


#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;
const int N=5010,NS=100010,INF=2147000000;
int n,a[N],b[N],w[N],lb[N],rb[N],p[N],sum;
int h[NS],tot,cnt,root[N];
int list[NS],ltot,maxs;
int ch[NS][2];
int S,T,dis[NS],cur[NS];
queue<int> q;
struct Edge{int v,f,next;}g[1000010];
inline void addEdge(int u,int v,int f){g[++tot].v=v; g[tot].f=f; g[tot].next=h[u]; h[u]=tot;g[++tot].v=u; g[tot].f=0; g[tot].next=h[v]; h[v]=tot;
}
void lsh(){sort(list+1,list+1+ltot);ltot=unique(list+1,list+1+ltot)-list-1;maxs=ltot;for(int i=1;i<=n;i++){a[i]=lower_bound(list+1,list+1+ltot,a[i])-list;lb[i]=lower_bound(list+1,list+1+ltot,lb[i])-list;rb[i]=lower_bound(list+1,list+1+ltot,rb[i])-list;}
}
int copy(int u){int v=++cnt;ch[v][0]=ch[u][0]; ch[v][1]=ch[u][1];if(u)addEdge(u,v,INF);return v;
}
void insert(int u,int &v,int l,int r,int pos,int who){v=copy(u);        addEdge(who*2-1,v,INF);if(l==r) return;int mid=(l+r)>>1;if(pos<=mid)insert(ch[u][0],ch[v][0],l,mid,pos,who);elseinsert(ch[u][1],ch[v][1],mid+1,r,pos,who);
}
void link(int u,int l,int r,int L,int R,int node){if(!u) return;if(L<=l&&r<=R){addEdge(u,node,INF);return;}int mid=(l+r)>>1;if(R<=mid) link(ch[u][0],l,mid,L,R,node);else if(mid<L) link(ch[u][1],mid+1,r,L,R,node);else{link(ch[u][0],l,mid,L,mid,node);link(ch[u][1],mid+1,r,mid+1,R,node);}
}
bool bfs(){while(!q.empty()) q.pop();q.push(S);for(int i=1;i<=cnt;i++) dis[i]=-1;dis[S]=0;while(!q.empty()){int u=q.front(); q.pop();for(int i=h[u],v;i;i=g[i].next)if(g[i].f&&dis[v=g[i].v]==-1){dis[v]=dis[u]+1;if(v==T) return true;q.push(v);}}return dis[T]!=-1;
}
int dfs(int u,int delta){if(u==T) return delta;int ret=0,get;for(int i=cur[u],v;i&&delta;i=g[i].next)if(g[i].f&&dis[v=g[i].v]==dis[u]+1){get=dfs(v,min(delta,g[i].f));g[i].f-=get;g[i^1].f+=get;if(g[i].f) cur[u]=i;delta-=get;ret+=get;}if(!ret) dis[u]=-1;return ret;
}
int dinic(){int ret=0;while(bfs()){for(int i=1;i<=cnt;i++) cur[i]=h[i];ret+=dfs(S,INF);}return ret;
}
int main(){scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d%d%d%d%d%d",&a[i],&b[i],&w[i],&lb[i],&rb[i],&p[i]);list[++ltot]=a[i];list[++ltot]=lb[i];list[++ltot]=rb[i];sum+=b[i]+w[i];}lsh();S=n*2+1; T=n*2+2;tot=1;for(int i=1;i<=n;i++){cnt+=2;addEdge(cnt,cnt-1,p[i]);addEdge(S,cnt-1,w[i]);addEdge(cnt-1,T,b[i]);}cnt+=2;for(int i=1;i<=n;i++)insert(root[i-1],root[i],1,maxs,a[i],i);    for(int i=2;i<=n;i++)link(root[i-1],1,maxs,lb[i],rb[i],i*2);int get=dinic();printf("%d\n",sum-get);return 0;
}
奇妙代码

 

转载于:https://www.cnblogs.com/RogerDTZ/p/8016382.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:https://dhexx.cn/news/show-18215.html

如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网进行投诉反馈,一经查实,立即删除!


相关文章:

  • 使用cordova,使html5也能像IOS,Android那样可以 调取手机的相机拍照功能
  • 莫比乌斯反演入门
  • java生产环境增量发版陷阱【原】
  • C# Conditional(方法,属性的忽略)使用
  • 单点登录测试点
  • 消息队列一:为什么需要消息队列(MQ)?
  • 新手指引,php什么是常量、变量、数组、类和对象及方法?
  • 高级装饰器---验证用户登录
  • Beta冲刺Day4
  • Python语法基础——关于全局变量与局部变量
  • 无线安全审计工具FruityWifi初体验
  • EntityFrameworkCore DBFirst
  • 解决 ThinkPad x270 安装 ubuntu 14.04 后的网络问题
  • C#cmd执行命令隐藏窗口,并保持程序一直运行
  • [Python WEB开发] 使用WSGI开发类Flask框架 (二)
  • 12306微信小程序上线 提供余票查询暂不支持购票
  • BZOJ1877 [SDOI2009]晨跑 【费用流】
  • 反射方式,获取出集合ArrayList类的class文件对象
  • BZOJ1079 [SCOI2008]着色方案 【dp记忆化搜索】
  • Python内置函数(17)——chr
  • 自定义裁剪图片大小
  • 544. Top k Largest Numbers【medium】
  • SVM支撑向量机原理
  • 定位CPU高问题三把斧
  • .NET使用存储过程实现对数据库的增删改查
  • Mysql几种索引类型的区别及适用情况
  • socket编程详解,转自http://www.sme-cn.com:82/archives/669
  • PP助手上传失效
  • Python图片爬虫
  • [3]java1.8线程池—ThreadPoolExecutor
  • springboot 注册服务注册中心(zk)的两种方式
  • [k8s]容器化node-expolore(9100)+cadvisor(8080)+prometheus(9090) metric搜集,grafana展示
  • 图片居中
  • [Luogu 1160] 队列安排
  • RAID (HP)双循环
  • cordova-plugin-alipay-v2使用篇(更新至20170725)(亲测可用)
  • ugui 九宫格和图片切割
  • 二分法查找python的实现
  • 用户推广成果总结会议
  • 数据访问基础
  • 数据仓库与数据挖掘(二)
  • 如何理解base href=%=basePath%
  • Unity 场景分页插件 World Streamer 支持无限大地图的解决方案(一)
  • shell 之while两种写法
  • layer关闭当前窗口并刷新父窗口
  • 服务端开发所需技能归纳
  • HackerRank Shashank and List
  • ES6--不定参数
  • tomcat,httpd 日志格式说明
  • IC卡插入与触点激活时序