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=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> ...
随机推荐
- C# 异常处理最佳实践,解决代码分析提示CA1031:不要捕捉一般异常类型的解决办法
异常类型 异常一般分为系统异常 和 应用异常.系统异常有无法连接数据库,而应用异常是业务逻辑异常,比如授权失败. 在 C# 中异常基于 System.Exception,派生出 System.Syst ...
- linux下的mongodb的备份与恢复
mongodb的备份有两种方式: 1.直接拷贝数据目录下的一切文件 2.使用mongodump方式 3.主从复制:http://www.cnblogs.com/huangxincheng/archiv ...
- python os 常用命令
转载:http://www.cnblogs.com/kaituorensheng/archive/2013/03/18/2965766.html python编程时,经常和文件.目录打交道,这是就离不 ...
- DispatcherServlet的工作原理
下面是DispatcherServlet的工作原理图,图片来源于网络. 下面是我从DispatcherServlet源码层面来分析其工作流程: 1.请求到达后,调用HandlerMapping来查找对 ...
- bzoj1430 小猴打架 prufer 序列
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=1430 题解 prufer 序列模板题. 一个由 \(n\) 个点构成的有标号无根树的个数为 \ ...
- configerparser模块
'''[mysqld]charater-server-set='utf8'default-engine='innodb'skip-grant-table=Trueport=3306 [client]u ...
- Check the port occupy on Mac OSX
Check the port occupy on Mac OSX lsof -i :7070 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME si ...
- BZOJ 4804: 欧拉心算 欧拉函数
Description 给出一个数字N Input 第一行为一个正整数T,表示数据组数. 接下来T行为询问,每行包含一个正整数N. T<=5000,N<=10^7 题解: 求 $\sum_ ...
- 【转】django 正则URL 匹配
django 正则URL 匹配 转自:https://www.cnblogs.com/chenkeven/articles/9305260.html 一.引子 在day17 作业中,我们查看主机详细 ...
- 修改Oracle数据库SGA和PGA大小
SGA的大小:一般物理内存20%用作操作系统保留,其他80%用于数据库.SGA普通数据库可以分配40%-60%之间,PGA可以分配20%-40%之间.1.以dba身份登录并查看SGA信息:SQL> ...