由于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. Petr#(字符串哈希)

    CF113B Petr# 大概就是字符串匹配加一个字符串哈希判重.懒得打kmp,就用字符串哈希匹配了. 字符串哈希大概就是把字符串转成一个p进制的数,每一段字符串都有一个对应的哈希值.p尽量取质数,这 ...

  2. UVA - 11582 Colossal Fibonacci Numbers! (巨大的斐波那契数!)

    题意:输入两个非负整数a.b和正整数n(0<=a,b<264,1<=n<=1000),你的任务是计算f(ab)除以n的余数,f(0) = 0, f(1) = 1,且对于所有非负 ...

  3. c++ 字符串转数字或数字转字符串

    在C++中字符串转换为数字,或数字转换为字符串,用到如下函数: _itoa atoi.atof.itoa.itow _itoa_s 1.整形转换为字符串: wchar_t * _itot(int _V ...

  4. ssi引用路径规则

    1.file:引用的是相对路径,相对当前文件的,特别注意使用file,被引用文件只能与当前文件同级.或下级.不能在其上级(不支持../) <!--#include file="head ...

  5. WebFlux系列(十二)MongoDB应用,新增、修改、查询、删除

    #Java#Spring#SpringBoot#Mongo#reactor#webflux#数据库#新增#修改#查询#删除# Spring Boot WebFlux Mongo数据库新增.删除.查询. ...

  6. 洛谷 P2196 挖地雷

    题目传送门 解题思路: 记忆化搜索,题目比较坑的地方在于,这是个有向图,给的边是单向边!!!!!!!! AC代码: #include<iostream> #include<cstdi ...

  7. zabbix监控日志关键字

    1 添加zabbix监控项目 A.选择类型为“”zabbix客户端(主动式)“” B.键值: xx_log.log 为日志的绝对路径 connectException 为关键字 ---需根据自己需要定 ...

  8. 剑指offer第40题

    package com.yan.offer; /** * 题目描述: * * 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. * * @author Ya ...

  9. UVA 127 链表和栈的使用

    刘汝佳的题目感觉都是比较难以处理的,就像这道题目,一看数据简直觉得头大...加上这个英文我也看的想死 最后看别人博客的题意讲解才知道原来是要移牌. 然后如果熟练的使用stack和手写链表的话,这个题目 ...

  10. PAT Advanced 1099 Build A Binary Search Tree (30) [⼆叉查找树BST]

    题目 A Binary Search Tree (BST) is recursively defined as a binary tree which has the following proper ...