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\). 问题转化 考虑到可以离线. 于是,我们就可以用一个 ...
随机推荐
- 新部署到服务器 报 The requested URL /home/profession was not found on this server. 错误
The requested URL /home/profession was not found on this server. 通过xxx.com, 首页可以正常访问,xxx.com/xx/xx 就 ...
- 每天一点点之vue框架开发 - vue组件之间传值(父向子传值)
路由文件 { path: '/productListBase', name: 'productListLink', component: ProductListBase, redirect: '/pr ...
- Android之Intent相关知识
什么是Intent?Intent的作用? Intent是一个消息传递对象,我们可以通过它来启动其他组件或者在组件之间传递数据. 通过Intent启动其他组件 Intent可以用来启动Activity, ...
- 14 —— npm —— 基本使用 ——初始化项目
概念:类似积木,可以组装成各种应用 node 的强大之处 : 可以随意使用这些组件 一,npm 是什么: nodejs 自带的包(模块)管理工具 二,查看 npm 的所有选项 三,查看各个选项的具体作 ...
- 3 ~ express ~ 静态文件托管
静态资源文件处理 (一)设置静态资源托管目录 /* * 当 用户访问的 url 以 /public 开始 ,那么直接返回对应 __dirname + '/public' 下的文件 . 注意是双下划 ...
- 网络基础:OSI 七层模型、TCP/IP 四层模型
1.Internet历史 1. 1968年由美国ARPA机构提出"资源共享计算机网络”,让ARPA的计算机互联起来,叫做阿帕网;2. 1974年,第一个TCP协议详细说明发布了.3. 一个 ...
- 一天一个设计模式——工厂方法(FactoryMethod)模式
一.模式说明 在前一个模板方法(Template Method)模式中,父类定义了处理流程,而流程中用到的方法交给子类去实现.类似的,在工厂方法模式中,父类决定如何生成实例,但并不决定所要生成的具体类 ...
- 2020/2/13 bluecmsv1.6sp1代码审计
0x00 前言 从今天开始审计一些小的cms,一周内至少审计一种,中间可能会写点别的有趣的东西 0x01 安装好后,看到登陆框,用万能密码打一发,无果,尝试重装,可以重装.有robots.txt 看u ...
- pytorch安装及基本用法
20180425更新 安装pytorch0.4.0: conda uninstall pytorch # 如果是CUDA版本的话 conda uninstall cuda80 cuda90 # 如果 ...
- 十一、GUI设计-记事本程序
"""记事本程序""" from tkinter import *from tkinter.filedialog import *from ...