【bzoj3218】a+b Problem 最小割+主席树
数据范围:$n≤5000$,$a,l,r≤10^9$,$b,w,p≤2\times 10^5$。
我们考虑一种暴力的最小割做法:
首先令$sum=\sum\limits_{i=1}^{n} b_i+w_i$
我们建一个图:
$S->i$,边权为$w_i$
$i->T$,边权为$b_i$
$i->i'$,边权为$p_i$
$j->i'$,边权为$∞$,(这里的i和j需要满足题目中的i,j限制)
然后我们对这个图跑一遍最小割,将$sum$减去这个值输出就是答案了。
这么建图总共需要$2n+2$个点,$O(n^2)$条边
#include<bits/stdc++.h>
#define M 1000005
#define N 150005
#define INF 19890604
using namespace std; struct edge{int u,v,next;}e[M]={}; int head[N]={},use=;
void add(int x,int y,int z){e[use].u=y;e[use].v=z;e[use].next=head[x];head[x]=use++;}
void ADD(int x,int y,int z){add(x,y,z); add(y,x,);} int dis[N]={},S,T; queue<int> q; bool bfs(){
memset(dis,,sizeof(dis));
q.push(S); dis[S]=;
while(!q.empty()){
int u=q.front(); q.pop();
for(int i=head[u];~i;i=e[i].next)
if(e[i].v&&dis[e[i].u]==){
dis[e[i].u]=dis[u]+;
q.push(e[i].u);
}
}
return dis[T];
} int dfs(int x,int flow){
if(x==T) return flow; int sum=;
for(int i=head[x];~i;i=e[i].next)
if(e[i].v&&dis[x]+==dis[e[i].u]){
int k=dfs(e[i].u,min(flow,e[i].v));
e[i].v-=k; e[i^].v+=k;
sum+=k; flow-=k;
if(flow==) return sum;
}
if(flow==) dis[x]=-;
return sum;
} int dinic(){
int res=;
while(bfs())
res+=dfs(S,<<);
return res;} int n,sum=;
int a[N]={},b[N]={},w[N]={},l[N]={},r[N]={},p[N]={},ok[N]={}; int main(){
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d%d%d%d%d%d",a+i,b+i,w+i,l+i,r+i,p+i);
sum+=b[i]+w[i];
}
S=,T=*n+;
memset(head,-,sizeof(head));
for(int i=;i<=n;i++) ADD(S,i,w[i]),ADD(i,T,b[i]),ADD(i+n,i,p[i]);
for(int i=;i<=n;i++) for(int j=;j<i;j++)
if(l[i]<=a[j]&&a[j]<=r[i])
ADD(j,i+n,INF);
cout<<sum-dinic()<<endl;
}
暴力
然后这个做法显然是会MLE的
我们发现原先的限制条件相当于在二维平面上框出一个允许的区间。
对于这种约束,我们可以用主席树来实现约束。
然后随便搞一搞就没了,注意细节。
#include<bits/stdc++.h>
#define M 400000
#define INF 19890604
using namespace std; struct edge{int u,v,next;}e[M]={}; int head[M]={},use=;
void add(int x,int y,int z){e[use].u=y;e[use].v=z;e[use].next=head[x];head[x]=use++;}
void ADD(int x,int y,int z){add(x,y,z); add(y,x,);} int dis[M]={},S,T; queue<int> q; bool bfs(){
memset(dis,,sizeof(dis));
q.push(S); dis[S]=;
while(!q.empty()){
int u=q.front(); q.pop();
for(int i=head[u];~i;i=e[i].next)
if(e[i].v&&dis[e[i].u]==){
dis[e[i].u]=dis[u]+;
q.push(e[i].u);
}
}
return dis[T];
} int dfs(int x,int flow){
if(x==T) return flow; int sum=;
for(int i=head[x];~i;i=e[i].next)
if(e[i].v&&dis[x]+==dis[e[i].u]){
int k=dfs(e[i].u,min(flow,e[i].v));
e[i].v-=k; e[i^].v+=k;
sum+=k; flow-=k;
if(flow==) return sum;
}
if(flow==) dis[x]=-;
return sum;
} int dinic(){int res=; while(bfs()) res+=dfs(S,<<); return res;} int c[M]={},a[M]={},b[M]={},w[M]={},l[M]={},r[M]={},p[M]={};
int lc[M]={},rc[M]={},cnt,rt=,sum=,n; void updata(int x,int l,int r,int ll,int rr,int id){
if(!x) return;
if(ll<=l&&r<=rr)return ADD(x,id,INF);
int mid=(l+r)>>;
if(ll<=mid) updata(lc[x],l,mid,ll,rr,id);
if(mid<rr) updata(rc[x],mid+,r,ll,rr,id);
}
void updata(int &x,int l,int r,int id,int k){
cnt++; lc[cnt]=lc[x]; rc[cnt]=rc[x];
if(x) ADD(x,cnt,INF); x=cnt;
ADD(k,x,INF);
if(l==r) return;
int mid=(l+r)>>;
if(id<=mid) updata(lc[x],l,mid,id,k);
else updata(rc[x],mid+,r,id,k);
} int main(){
memset(head,-,sizeof(head));
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%d%d%d%d%d%d",a+i,b+i,w+i,l+i,r+i,p+i);
c[i]=a[i]; sum+=b[i]+w[i];
}
sort(c+,c+n+);
for(int i=;i<=n;i++){
a[i]=lower_bound(c+,c+n+,a[i])-c;
l[i]=lower_bound(c+,c+n+,l[i])-c;
r[i]=upper_bound(c+,c+n+,r[i])-c-;
}
S=; T=*n+; cnt=*n+;
for(int i=;i<=n;i++){
ADD(S,i,w[i]);
ADD(i,T,b[i]);
ADD(i+n,i,p[i]);
if(l[i]<=r[i]) updata(rt,,n,l[i],r[i],i+n);
updata(rt,,n,a[i],i);
}
cout<<sum-dinic()<<endl;
}
【bzoj3218】a+b Problem 最小割+主席树的更多相关文章
- BZOJ3218 UOJ#77 A+B Problem(最小割+主席树)
竟然在BZOJ上拿了Rank1太给力啦. p.s.:汗,一发这个就被一堆人在2月27号强势打脸-- 传送门(BZOJ) 传送门(UOJ) 说说这道题目吧: 首先是说说这个构图吧.因为有选择关系,我们很 ...
- bzoj3218 a+b Problem(最小割+主席树优化建边)
由于6.22博主要学测,大半时间学文化课,近期刷题量&写题解的数量会急剧下降. 这题出得挺经典的,首先一眼最小割,考虑朴素的做法:与S联通表示白色,与T联通表示黑色,S向i连流量为w[i]的边 ...
- bzoj 3218 a + b Problem(最小割+主席树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3218 [题意] 给n个格子涂白或黑色,白则wi,黑则bi的好看度,若黑格i存在: 1& ...
- [bzoj3218] a+b problem [最小割+数据结构优化建图]
题面 传送门 思路 最小割 我们首先忽略掉那个奇♂怪的限制,就有一个比较显然的最小割模型: 建立源点$S$和汇点$T$ 对于每个元素$i$建立一个点$i$,连边$<S,i,w[i]>$和$ ...
- bzoj3218 a + b Problem(网络流+主席树)
$ans=\sum_{color_i=black}\ b_i+\sum_{color_i=white}\ w_i-\sum_{i=abnormal}\ p_i$ 把它转化一下 $ans=\sum_{i ...
- 【BZOJ-3218】a+b Problem 最小割 + 可持久化线段树
3218: a + b Problem Time Limit: 20 Sec Memory Limit: 40 MBSubmit: 1320 Solved: 498[Submit][Status] ...
- Yet Another Maxflow Problem CodeForces - 903G (最小割,线段树)
大意: 两个n元素集合$A$, $B$, $A_i$与$A_{i+1}$连一条有向边, $B_i$与$B_{i+1}$连一条有向边, 给定$m$条从$A_i$连向$B_j$的有向边, 每次询问修改$A ...
- P4137 Rmq Problem / mex(主席树)
传送门 思路: 直接上主席树,对于每个询问\((l,r)\),我们在第\(r\)个版本的主席树中查询最晚出现的小于\(l\)最小的数就行了. 因为答案可能为\(a_i+1\),所以我们在离散化的时候考 ...
- Codeforces 1368H - Breadboard Capacity(最小割+线段树维护矩阵乘法)
Easy version:Codeforces 题面传送门 & 洛谷题面传送门 Hard version:Codeforces 题面传送门 & 洛谷题面传送门 首先看到这种从某一种颜色 ...
随机推荐
- 2019.01.24 NOIP训练 旅行(轮廓线dp)
传送门 题意简述: 给一个n∗mn*mn∗m的有障碍的网格图,问你从左上角走到左下角并覆盖所有可行格子的路径条数. 思路: 路径不是很好算. 将图改造一下,在最前面添两列,第一列全部能通过,第二列只有 ...
- 2019.01.22 bzoj3333: 排队计划(逆序对+线段树)
传送门 题意简述:给出一个序列,支持把ppp~nnn中所有小于等于apa_pap的'扯出来排序之后再放回去,要求动态维护全局逆序对. 思路:我们令fif_ifi表示第iii个位置之后比它大的数的个 ...
- Le Chapitre VII
Le cinquième jour, toujours grâce au mouton, ce secrèt de la vie du petit prince me fut révélé. Il m ...
- MFC中的几个虚函数
1.PreTranslateMessage()和WindowProc() PreTranslateMessage是消息在送给TranslateMessage函数之前被调用的,通过函数名也可以猜出来.绝 ...
- openstack 租户、用户管理
创建domain [root@cc01 ~]# openstack domain create --description "Default Domain" default +-- ...
- application.properties /application.yml官网查看配置;springboot application.properties 官网查看,info yml 查看;springboot.yml查看info;springboot.yml查看Actuator监控中心info
官网查看: https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#appendix 查看info ...
- 学python之路前的一些话
为什么学python: 这些年一直从事运维相关的工作.但做下来感觉都是些很基础的东西,无非就是对一些命令或者问题处理很熟练而已,混的都是经验.曾很羡慕会写shell脚本,会自动化安装程序的运维组组长, ...
- REST WebService与SOAP WebService的比较
在SOA的基础技术实现方式中WebService占据了很重要的地位,通常我们提到WebService第一想法就是SOAP消息在各种传输协议上交互.近几年REST的思想伴随着SOA逐渐被大家接受,同时各 ...
- linux搭建简易版本的FastDFS服务器
开发环境:centos7环境 搭建FastDFS集群搭建非常复杂,对于初期学习FastDFS来说,搭建个单机版的作为入门更为实际一些. 首先感谢“在京奋斗者“”博主的详细搭建过程,附上博客地址http ...
- ( 递归 )Fractal -- POJ -- 2083
http://poj.org/problem?id=2083 Fractal Time Limit: 1000MS Memory Limit: 30000K Total Submissions: ...