由于6.22博主要学测,大半时间学文化课,近期刷题量&写题解的数量会急剧下降。

这题出得挺经典的,首先一眼最小割,考虑朴素的做法:与S联通表示白色,与T联通表示黑色,S向i连流量为w[i]的边,i向T连流量为b[i]的边,然后i'向i连容量为p[i]的边,所有满足条件的j向i'连一条容量为无穷大的边(只要满足其一就要割掉)。然后边数显然不合法,一眼线段树优化,然而发现线段树无法连边,考虑主席树连边,对原序列建主席树,每个点的区间对应主席树上的O(logn)个节点,然后连接容量为无穷大的边即可。

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+,M=1e6+,inf=1e9;
struct edge{int x,id;}e[N];
int n,m,ecnt,tot,T,ans,mx;
int L[N],R[N],val[N],seq[N],hd[N],v[M],w[M],nxt[M],q[N],lv[N],lc[N],rc[N],root[N],cnt[N];
void adde(int x,int y,int z)
{
v[++ecnt]=y,w[ecnt]=z,nxt[ecnt]=hd[x],hd[x]=ecnt;
v[++ecnt]=x,w[ecnt]=,nxt[ecnt]=hd[y],hd[y]=ecnt;
}
int findl(int x)
{
int l=,r=mx,ans=mx;
while(l<=r)
{
int mid=l+r>>;
if(seq[mid]>=x)ans=mid,r=mid-;else l=mid+;
}
return ans;
}
int findr(int x)
{
int l=,r=mx,ans=;
while(l<=r)
{
int mid=l+r>>;
if(seq[mid]<=x)ans=mid,l=mid+;else r=mid-;
}
return ans;
}
int update(int prt,int l,int r,int i)
{
int rt=++tot;
if(l==r)lc[rt]=rc[rt]=,cnt[rt]=cnt[prt]+;
else{
int mid=l+r>>;
if(val[i]<=mid)lc[rt]=update(lc[prt],l,mid,i),rc[rt]=rc[prt];
else rc[rt]=update(rc[prt],mid+,r,i),lc[rt]=lc[prt];
cnt[rt]=cnt[lc[rt]]+cnt[rc[rt]];
}
adde(i,*n++rt,inf);
adde(*n++prt,*n++rt,inf);
return rt;
}
void query(int rt,int l,int r,int i)
{
if(!cnt[rt])return;
if(L[i]<=l&&r<=R[i]){adde(*n++rt,n+i,inf);return;}
int mid=l+r>>;
if(L[i]<=mid)query(lc[rt],l,mid,i);
if(R[i]>mid)query(rc[rt],mid+,r,i);
}
bool bfs()
{
memset(lv,-,sizeof lv);
int qs=,qe=;
q[]=lv[]=;
while(qs<qe)
{
int u=q[qs++];
for(int i=hd[u];i;i=nxt[i])if(w[i]&&lv[v[i]]==-)lv[v[i]]=lv[u]+,q[qe++]=v[i];
}
if(lv[T]==-)return ;
return ;
}
int dfs(int u,int low)
{
if(u==T||!low)return low;
int sum=;
for(int i=hd[u];i;i=nxt[i])
if(w[i]&&lv[v[i]]==lv[u]+)
{
int tmp=dfs(v[i],min(low,w[i]));
w[i]-=tmp,w[i^]+=tmp,low-=tmp,sum+=tmp;
if(!low)return sum;
}
if(low)lv[u]=-;
return sum;
}
bool cmp(edge x,edge y){return x.x<y.x;}
int main()
{
scanf("%d",&n);
ecnt=,T=1e5;
for(int i=,b,w,p;i<=n;i++)
{
scanf("%d%d%d%d%d%d",&e[i].x,&b,&w,&L[i],&R[i],&p);
e[i].id=i,ans+=b+w,adde(,i,w),adde(i,T,b),adde(n+i,i,p);
}
sort(e+,e+n+,cmp);
mx=val[e[].id]=,seq[]=e[].x;
for(int i=;i<=n;i++)
if(e[i].x==e[i-].x)val[e[i].id]=mx;else val[e[i].id]=++mx,seq[mx]=e[i].x;
for(int i=;i<=n;i++)
{
L[i]=findl(L[i]),R[i]=findr(R[i]);
root[i]=update(root[i-],,mx,i),query(root[i-],,mx,i);
}
while(bfs())ans-=dfs(,inf);
printf("%d",ans);
}

bzoj3218 a+b Problem(最小割+主席树优化建边)的更多相关文章

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

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

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

  3. Newnode's NOI(P?)模拟赛 第三题 (主席树优化建图 + tarjan)

    题目/题解戳这里 这道题题目保证a,b,ca,b,ca,b,c各是一个排列-mdzz考场上想到正解但是没看到是排列,相等的情况想了半天-然后写了暴力60分走人- 由于两两间关系一定,那么就是一个竞赛图 ...

  4. UOJ#77. A+B Problem [可持久化线段树优化建边 最小割]

    UOJ#77. A+B Problem 题意:自己看 接触过线段树优化建图后思路不难想,细节要处理好 乱建图无果后想到最小割 白色和黑色只能选一个,割掉一个就行了 之前选白色必须额外割掉一个p[i], ...

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

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

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

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

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

  8. BZOJ 5496: [2019省队联测]字符串问题 (后缀数组+主席树优化建图+拓扑排序)

    题意 略 分析 考场上写了暴力建图40分溜了-(结果只得了30分) 然后只要优化建边就行了 首先给出的支配关系无法优化,就直接A向它支配的B连边. 考虑B向以B作为前缀的所有A连边,做一遍后缀数组,两 ...

  9. 【洛谷5287】[HNOI2019] JOJO(主席树优化KMP)

    点此看题面 大致题意: 每次往一个字符串末尾加上\(x\)个字符\(c\),或者回到某一历史版本,求\(KMP\)的\(\sum Next_i\). 问题转化 考虑到可以离线. 于是,我们就可以用一个 ...

随机推荐

  1. Node.js NPM 包(Package)

    章节 Node.js NPM 介绍 Node.js NPM 作用 Node.js NPM 包(Package) Node.js NPM 管理包 Node.js NPM Package.json 包是打 ...

  2. windows driver 映射大文件

    //如果要做到掉电后仍然可以继续向下操作,可以记录文件的位置重新映射 NTSTATUS status; UNICODE_STRING strFileSrc = RTL_CONSTANT_STRING( ...

  3. zabbix监控oracle之orabbix安装

    zabbix服务器安装配置 zabbixserver中安装该软件 mkdir /opt/orabbix cp orabbix-1.2.3.zip /opt/orabbix cd /opt/orabbi ...

  4. JVM探秘:jinfo查看JVM运行时参数

    本系列笔记主要基于<深入理解Java虚拟机:JVM高级特性与最佳实践 第2版>,是这本书的读书笔记. 如何查看JVM运行时参数,对于线上JVM调优是很关键的,因为只有知道了当前使用的JVM ...

  5. JSTL 运算符汇总

    算术运算符 + . - . * . / (或 div )和 % (或 mod )  关系运算符 == (或 eq ). != (或 ne ). < (或 lt ). > (或 gt ). ...

  6. pyCharm中设置查看运行过程中的变量实时情况

    1.点击运行栏的这个灰色向下剪头: 2.单击“Edit Configurations”, 3.在出现的窗口上,勾选上:“Show command line afterwards” 或 “run wit ...

  7. JAVA函数库

    1. 文件相关 1.1 判断目录是否存在 public static boolean dictionaryExist(String path) { File file = new File(path) ...

  8. c++ 模板练习2

    #include "stdafx.h" #include <iostream> using namespace std; template<class T> ...

  9. 数组 bash shell

    http://www.cnblogs.com/chengmo/archive/2010/09/30/1839632.html #!/bin/bash # 脚本检测到离线主机会发送邮件通知,可一直运行. ...

  10. salt如何查看文档帮助

    1.查看普通模块和函数使用方法 salt 'minion' sys.doc  module_name salt ‘minion'  sys.doc module_name.function_name ...