bzoj3218 a + b Problem(网络流+主席树)
.jpg)
.jpg)
$ans=\sum_{color_i=black}\ b_i+\sum_{color_i=white}\ w_i-\sum_{i=abnormal}\ p_i$
把它转化一下
$ans=\sum_{i=1}^{n}(b_i+w_i)-\sum_{color_i=black}\ w_i-\sum_{color_i=white}\ b_i-\sum_{i=abnormal}\ p_i$
这不是最小割--最大权闭合子图的套路吗!
设$S$割为黑点集合,$T$割为白点集合
怎么处理奇怪的方格?套路地把$i$拆成$i_1,i_2$
对于每个点$i$:
$links(S,i_1,b_i),link(i_1,T,w_i),link(i_1,i_2,p_i)$
对于每个$j<i,l_i<a_j<r_i$,$link(i_2,j_1,inf)$
于是你就可以AC拿到部分分辣!
但是由于出题人毒瘤的搞大数据,还需要优化
注意到每次连边时$j$都需要枚举,复杂度$O(n^2)$
考虑用主席树把复杂度降到$(nlogn)$
先把所有$a_i,l_i,r_i$拿来搞一遍离散化做主席树的下标
处理到点$i$时,先在主席树上查询$[l_i,r_i]$包含的区间,直接把$i_2$连到那个区间上去,$link(i_2,o,inf)$
蓝后再把点$i$按$a_i$加入到主席树上包含$a_i$的区间内,$link(o,i_1,inf)$
别忘了和上个版本连起来$link(o,p,inf)$
最终:$ans=\sum_{i=1}^{n}(b_i+w_i)-dinic()$
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
typedef long long ll;
#define N 100005
#define M 2000005
const int inf=2e9;
int n,S,T,cur[N],d[N]; ll ans;
int m,b[N],L[N],R[N],A[N];
int u,rt[N],lc[N],rc[N];
queue <int> h; bool vis[N];
int cnt=,hd[N],nxt[M],ed[N],poi[M];ll val[M];
inline void adde(int x,int y,int v){
nxt[ed[x]]=++cnt, hd[x]=hd[x]?hd[x]:cnt,
ed[x]=cnt, poi[cnt]=y, val[cnt]=v;
}
inline void link(int x,int y,int v){adde(x,y,v),adde(y,x,);}
bool bfs(){
for(int i=;i<=u;++i) vis[i]=,cur[i]=hd[i];
h.push(S); vis[S]=;
while(!h.empty()){
int x=h.front(); h.pop();
for(int i=hd[x];i;i=nxt[i]){
int to=poi[i];
if(!vis[to]&&val[i]>)
vis[to]=,d[to]=d[x]+,h.push(to);
}
}return vis[T];
}
ll dfs(int x,ll a){
if(x==T||a==) return a;
ll F=,f;
for(int &i=cur[x];i;i=nxt[i]){
int to=poi[i];
if(d[to]==d[x]+&&(f=dfs(to,min(a,val[i])))>)
a-=f,F+=f,val[i]-=f,val[i^]+=f;
if(!a) break;
}return F;
}
ll dinic(){ll re=; while(bfs())re+=dfs(S,inf); return re;}
#define mid (l+r)/2
void Add(int &o,int p,int l,int r,int v){
o=++u; if(p)link(o,p,inf);
link(o,v,inf);//加入到包含a_v的区间
if(l==r) return;
if(A[v]<=mid) Add(lc[o],lc[p],l,mid,v),rc[o]=rc[p];
else Add(rc[o],rc[p],mid+,r,v),lc[o]=lc[p];
}
void Ask(int o,int l,int r,int x1,int x2,int v){
if(!o) return ;
if(x1<=l&&r<=x2) {link(v+n,o,inf); return;}
if(x1<=mid) Ask(lc[o],l,mid,x1,x2,v);
if(x2>mid) Ask(rc[o],mid+,r,x1,x2,v);
}
int main(){
scanf("%d",&n);
S=n*+; T=S+; u=T+;
for(int i=,B,W,P;i<=n;++i){
scanf("%d%d%d%d%d%d",&A[i],&B,&W,&L[i],&R[i],&P);
ans+=B+W; b[++m]=A[i]; b[++m]=L[i]; b[++m]=R[i];
link(S,i,B); link(i,T,W); link(i,i+n,P);
}sort(b+,b+m+); m=unique(b+,b+m+)-b-;//离散化
for(int i=;i<=n;++i){
A[i]=lower_bound(b+,b+m+,A[i])-b;
L[i]=lower_bound(b+,b+m+,L[i])-b;
R[i]=lower_bound(b+,b+m+,R[i])-b;
Ask(rt[i-],,m,L[i],R[i],i);
Add(rt[i],rt[i-],,m,i);
}printf("%lld",ans-dinic());
return ;
}
bzoj3218 a + b Problem(网络流+主席树)的更多相关文章
- [bzoj3218]a + b Problem 网络流+主席树优化建图
3218: a + b Problem Time Limit: 20 Sec Memory Limit: 40 MBSubmit: 2229 Solved: 836[Submit][Status] ...
- Luogu4137 Rmq problem/mex 主席树
传送门 用主席树水莫队题…… 我们对于前缀和建立主席树,对于主席树中的每一个叶子节点表示它对应的数字最后出现的位置的编号,非叶子节点求左右节点的最小值,那么对于每一次询问$l,r$就是在第$r$棵主席 ...
- bzoj3489: A simple rmq problem (主席树)
//========================== 蒟蒻Macaulish:http://www.cnblogs.com/Macaulish/ 转载要声明! //=============== ...
- luogu P4137 Rmq Problem / mex 主席树 + 思维
Code: #include<bits/stdc++.h> #define maxn 200001 using namespace std; void setIO(string s) { ...
- 【CF464E】The Classic Problem(主席树+最短路)
点此看题面 大致题意: 给你一张无向图,每条边的边权为\(2^{x_i}\),求\(s\)到\(t\)的最短路. 最短路 最短路,首先考虑\(Dijkstra\).这里用\(SPFA\)似乎不太好,因 ...
- 洛谷$P$4137 $Rmq\ Problem / mex$ 主席树
正解:主席树 解题报告: 传送门$QwQ$ 本来以为是道入门无脑板子题,,,然后康了眼数据范围发现并没有我想像的那么简单昂$kk$ 这时候看到$n$的范围不大,显然考虑离散化?但是又感觉似乎布星?因为 ...
- Codeforces 464E The Classic Problem(主席树+最短路+哈希,神仙题)
题目链接 题意:给出一张 \(n\) 个点 \(m\) 条边的无向图,第 \(i\) 条边连接 \(u_i,v_i\),边权为 \(2^{w_i}\),求 \(s\) 到 \(t\) 的最短路. \( ...
- bzoj 3218: a + b Problem【主席树+最小割】
直接建图比较显然,是(s,i,w),(i,t,b),(i,i',p),(i,j,inf),然而建出来之后发现边数是n方级别的,显然跑不过去,然后就有一种比较神的思路:把a离散了建一棵权值线段树,然后要 ...
- 洛谷 p3834 主席树
题目链接:https://www.luogu.org/problem/P3834 主席树求静态区间第k小 #include<iostream> #include<cstdio> ...
随机推荐
- 编译安装github上的kafka_exporter项目
本文介绍的kafka_exporter是prometheus监控系统中针对kafka的一款监控插件,要使用这个监控插件,kafka的版本需要满足 0.10.1.0 及以上. 项目的github地址:h ...
- NOIP原题板刷
update 10.11 我可能已经刷完大部分了,可是这篇blog我也不想更了 这个人很懒,做了很多题但是不想写题解,也不想更blog,所以这篇blog又咕咕了. 把从 \(1997-2017\) 近 ...
- Zabbix分布式监控系统实践
https://www.zabbix.com/wiki/howto/install/Ubuntu/ubuntuinstall 环境介绍OS: Ubuntu 10.10 Server 64-bitSer ...
- RMQ Direct
原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11792398.html RMQ Direct Project Directory Maven Depe ...
- fast
# connect timeout in seconds# default value is 30sconnect_timeout=30 # network timeout in seconds# d ...
- Selenium-三种等待方式
在UI自动化测试中,必然会遇到环境不稳定,网络慢的情况,这时如果不做任何处理的话,代码会由于没有找到元素而报错.这时我们就要用到wait,而在Selenium中,我们可以用到一共三种等待,每一种等待都 ...
- 5G即将到来!我们需要一部怎样的手机呢?
随着5G技术研发试验即将于年底宣告完成,也就意味着2019年起,5G商用将会宣布启动,现在OPPO.vivo.小米.华为.一加等众多手机厂商也宣布启动5G计划,这时5G势必会掀起一股新鲜的血液,5G手 ...
- C#通过文件头判断文件的类型(不是后缀名)
FileStream fs=new FileStream(@"D:\6",FileMode.Open,FileAccess.Read); BinaryReader reader= ...
- 带有lazy标记的线段树
#include<bits/stdc++.h> using namespace std; ]; struct st{ int l,r,val,add; }tr[]; void build( ...
- python读取数据
#读取一行数据,去掉头尾空格 line = sys.stdin.readline().strip() #line类型为字符串 #字符串变成列表 line = sys.stdin.readline(). ...