数据范围:$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 最小割+主席树的更多相关文章

  1. BZOJ3218 UOJ#77 A+B Problem(最小割+主席树)

    竟然在BZOJ上拿了Rank1太给力啦. p.s.:汗,一发这个就被一堆人在2月27号强势打脸-- 传送门(BZOJ) 传送门(UOJ) 说说这道题目吧: 首先是说说这个构图吧.因为有选择关系,我们很 ...

  2. bzoj3218 a+b Problem(最小割+主席树优化建边)

    由于6.22博主要学测,大半时间学文化课,近期刷题量&写题解的数量会急剧下降. 这题出得挺经典的,首先一眼最小割,考虑朴素的做法:与S联通表示白色,与T联通表示黑色,S向i连流量为w[i]的边 ...

  3. bzoj 3218 a + b Problem(最小割+主席树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3218 [题意] 给n个格子涂白或黑色,白则wi,黑则bi的好看度,若黑格i存在: 1& ...

  4. [bzoj3218] a+b problem [最小割+数据结构优化建图]

    题面 传送门 思路 最小割 我们首先忽略掉那个奇♂怪的限制,就有一个比较显然的最小割模型: 建立源点$S$和汇点$T$ 对于每个元素$i$建立一个点$i$,连边$<S,i,w[i]>$和$ ...

  5. 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 ...

  6. 【BZOJ-3218】a+b Problem 最小割 + 可持久化线段树

    3218: a + b Problem Time Limit: 20 Sec  Memory Limit: 40 MBSubmit: 1320  Solved: 498[Submit][Status] ...

  7. 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 ...

  8. P4137 Rmq Problem / mex(主席树)

    传送门 思路: 直接上主席树,对于每个询问\((l,r)\),我们在第\(r\)个版本的主席树中查询最晚出现的小于\(l\)最小的数就行了. 因为答案可能为\(a_i+1\),所以我们在离散化的时候考 ...

  9. Codeforces 1368H - Breadboard Capacity(最小割+线段树维护矩阵乘法)

    Easy version:Codeforces 题面传送门 & 洛谷题面传送门 Hard version:Codeforces 题面传送门 & 洛谷题面传送门 首先看到这种从某一种颜色 ...

随机推荐

  1. 2019.01.17 bzoj1853: [Scoi2010]幸运数字(容斥+dfs)

    传送门 搜索菜题,然而第一次没有注意然后爆longlonglong longlonglong了. 题意:称所有数位由6,86,86,8组成的数为幸运数字,问一个一个区间[l,r][l,r][l,r]中 ...

  2. Office2013 如何安装Matlab notebook

    Office2013 如何安装Matlab notebook 听语音 浏览:912 | 更新:2014-09-16 07:02 1 2 3 4 5 6 7 分步阅读 Office2013(64bit) ...

  3. c#内存中创建反射

    代码 IWFP_SYS_Bytes mywfpbyte; /**/ byte[] bin=null; using (FileStream fs = new FileStream(filename, F ...

  4. Hibernate关联关系配置(一对多,一对一,多对多)

    一对多 创建两个类  Manager(一这一端) Worker(多这一端)  即一个经理下有多个员工 package com.hibernate.n21; import java.util.HashS ...

  5. silverlight 父窗体传值给ChildWindow

    在网上找了许多列子,有的没有看懂,有的太麻烦. 现在有两种方法又简单又实用的,分享给大家! 第一种:使用构造函数传值 1.子页面新建一个构造函数 public ChildWindowTest(stri ...

  6. Redis集群master选举时长测试

    在一台物理机上启动6个Redis实例,组成3主3从集群,端口号依次为:1379 ~ 1384,端口号1379.1380和1384三个为master,端口1379的进程ID为17620.现将进程1762 ...

  7. Ng第四课:多变量线性回归(Linear Regression with Multiple Variables)

    4.1  多维特征 4.2  多变量梯度下降 4.3  梯度下降法实践 1-特征缩放 4.4  梯度下降法实践 2-学习率 4.5  特征和多项式回归 4.6  正规方程 4.7  正规方程及不可逆性 ...

  8. vcpkg-微软开发的VC++打包工具

    vcpkg-VC++打包工具 1. 介绍 VCPKG,是VC++ Packaging Tool. 是微软 C++ 团队开发的在 Windows 上运行的 C/C++ 项目包管理工具,可以帮助您在 Wi ...

  9. python_条件语句

    条件语句 Python条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块. Python程序语言指定任何非0和非空(null)值为true,0 或者 null为fals ...

  10. Redis中在程序中的应用

    1.导入redis的配置文件,因为要交给web容器管理,所以直接命名为ApplicationContext-redis.xml,具体配置如下: <beans xmlns="http:/ ...