bzoj3218 a+b Problem(最小割+主席树优化建边)
由于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(最小割+主席树优化建边)的更多相关文章
- 【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 ...
- BZOJ3218 UOJ#77 A+B Problem(最小割+主席树)
竟然在BZOJ上拿了Rank1太给力啦. p.s.:汗,一发这个就被一堆人在2月27号强势打脸-- 传送门(BZOJ) 传送门(UOJ) 说说这道题目吧: 首先是说说这个构图吧.因为有选择关系,我们很 ...
- Newnode's NOI(P?)模拟赛 第三题 (主席树优化建图 + tarjan)
题目/题解戳这里 这道题题目保证a,b,ca,b,ca,b,c各是一个排列-mdzz考场上想到正解但是没看到是排列,相等的情况想了半天-然后写了暴力60分走人- 由于两两间关系一定,那么就是一个竞赛图 ...
- UOJ#77. A+B Problem [可持久化线段树优化建边 最小割]
UOJ#77. A+B Problem 题意:自己看 接触过线段树优化建图后思路不难想,细节要处理好 乱建图无果后想到最小割 白色和黑色只能选一个,割掉一个就行了 之前选白色必须额外割掉一个p[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 5496: [2019省队联测]字符串问题 (后缀数组+主席树优化建图+拓扑排序)
题意 略 分析 考场上写了暴力建图40分溜了-(结果只得了30分) 然后只要优化建边就行了 首先给出的支配关系无法优化,就直接A向它支配的B连边. 考虑B向以B作为前缀的所有A连边,做一遍后缀数组,两 ...
- 【洛谷5287】[HNOI2019] JOJO(主席树优化KMP)
点此看题面 大致题意: 每次往一个字符串末尾加上\(x\)个字符\(c\),或者回到某一历史版本,求\(KMP\)的\(\sum Next_i\). 问题转化 考虑到可以离线. 于是,我们就可以用一个 ...
随机推荐
- spring学习第7天(PCD以及切点表达式)
1.PCD(PointCutDesigner) spring的aop只针对方法进行aop代理,而apectj联盟的aop比之更加强大,还可以针对字段等进行切面编程 1.1:execution,用的最多 ...
- VM安装CentOS7步骤
VM15下载,在360软件管家就可以下载 CentOS7下载地址:http://mirror.bit.edu.cn/centos/7.6.1810/isos/x86_64/CentOS-7-x86_6 ...
- python_re正则表达
re模块就本质而言,正则表达式(或RE)是一种小型的.高度专业化的编程语言,(在python中)它内嵌在Python中,并通过re模块实现,正则表达式模块被编译成一系列的字节码,然后由用C编写的匹配引 ...
- 使用模拟器调试react-native步骤(安卓机)
1.在cmd界面搭建react-native 环境: 可参考https://reactnative.cn/docs/0.51/getting-started.html#content (1)npm i ...
- zabbix_agent_win
http://mayulin.blog.51cto.com/1628315/514447/ http://www.cnblogs.com/likehua/p/3968689.html 先下载win客户 ...
- yarn storm spark
单机zookeeper http://coolxing.iteye.com/blog/1871009 storm http://os.51cto.com/art/201309/411003_2.htm ...
- 《新标准C++程序设计》1.7-1.10(C++学习笔记2)
1.内联函数(inline关键字) eg.inline int Max(int a,int b) { if(a>b) return a; return b; } 当编译器处理调用内联函数的语句时 ...
- Mac OS 终端 iTerm2配置大全
转载链接:https://www.cnblogs.com/diyxiaoshitou/p/9017413.html,在按照原文执行时发现有些问题,所以本文对原文中存在问题的地方做了些调整. 之前一直使 ...
- 吴裕雄--天生自然C++语言学习笔记:C++ 注释
程序的注释是解释性语句,可以在 C++ 代码中包含注释,这将提高源代码的可读性.所有的编程语言都允许某种形式的注释. C++ 支持单行注释和多行注释.注释中的所有字符会被 C++ 编译器忽略. C++ ...
- HashMap核心功能源码浅析
1.引子 "HashMap"由“hash”和“map"两个单词组成,这里的”map"表示“映射”而不是“地图”的意思,两个单词连起来就是“哈希映射表”.Map是 ...