由于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. Mac安装vue产生错误

    npm WARN checkPermissions Missing write access to /usr/local/lib/node_modules/webpack/node_modules/_ ...

  2. eclipse的重要快捷键

    1.快速修正:ctrl + 1 2.单词补全:alt + / 3.查看轮廓:ctrl + o 4.打开eclipse中工作区的资源: ctrl + shift + r 它可以打开当前eclipse的工 ...

  3. Frequently arduino function

    unctions                                                     功能if(Serial)                           ...

  4. InstrumentationTextCase 测试

    <instrumentation        android:name="android.test.InstrumentationTestRunner"        an ...

  5. windows elasticsearch-head插件安装教程

    elasticsearch-head下载地址:https://github.com/mobz/elasticsearch-head 1.git下载 git clone git://github.com ...

  6. python期末复习—列表

    列表:列表元素需用逗号分隔,放在方括号里,如:list=['Q',15];元素类型可以是数字,单个字符,字符串,列表.字符串和字符需要用单引号引起来. 访问列表:print(列表名[0])访问第一个元 ...

  7. 阿里P7Java最全面试296题:阿里天猫、蚂蚁金服含答案文档解析

    [阿里天猫.蚂蚁.钉钉面试专题题目加答案] 不会做别着急:文末有答案以及视频讲解,架构师资料 1. junit用法,before,beforeClass,after, afterClass的执行顺序 ...

  8. 2020/1/30 PHP代码审计之CSRF漏洞

    0x00 CSRF漏洞 CSRF(Cross-site request forgery)跨站请求伪造:也被称为"One Click Attack"或者Session Riding, ...

  9. axios基础介绍

    axios基础介绍 get请求要在params中定义,post要在data中定义.

  10. libcurl在windows下的使用

    curl在linux下很好用,但到了windows下写程序却没办法使用了,这时候可以使用libcurl库 libcurl库的编译网上很多,我就不一一赘述了,curl的官方网站:https://curl ...