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> ...
随机推荐
- 2-基于6U VPX的双TMS320C6678+Xilinx FPGA K7 XC7K420T的图像信号处理板
基于6U VPX的双TMS320C6678+Xilinx FPGA K7 XC7K420T的图像信号处理板 综合图像处理硬件平台包括图像信号处理板2块,视频处理板1块,主控板1块,电源板1块,VPX背 ...
- 三、Windows下用FFmpeg+nginx+rtmp搭建直播环境 实现推流、拉流
一.环境 1.开发环境:windows 2.开发工具:FFmpeg.nginx.nginx-rmtp-module (链接:https://pan.baidu.com/s/119d2GeMzddas_ ...
- git如何上传大文件,突破大小限制
Github中单个文件的大小限制是100MB,为了能突破这个限制,我们需要使用Git Large File Storage这个工具, git lfs install git lfs track &qu ...
- SpringBoot 利用freemaker生成静态页面
1. <!-- freemarker模板 --> <dependency> <groupId>org.springframework.boot</groupI ...
- 前端之form表单与css(1)
目录 一.form表单 1.1表单的属性 1.2input 1.2.1form表单提交数据的两种方式 1.3select标签 1.4label标签 1.5textarea多行文本标签 二.CSS 2. ...
- [POJ 1911] 棋盘
问题描述 将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的部分继续如此分割,这样割了(n-1)次后,连同最后剩下的矩形棋盘共有n块矩形棋盘.(每次切割都只能沿着 ...
- 策略模式优化过多的IF ELSE
前言: 当if else的条件少的话,代码可阅读性及逻辑不影响阅读和扩展.一旦if else过多的话会导致逻辑比较混乱,不易扩展并且很容易出错. 实现方案: 1.定义一个@HandlerType注解, ...
- postman与soapui操作
get和post请求的区别? get请求:直接在浏览器里直接调用就可以了,不用借助工具 向服务端获取数据的 数据是放在url里面 post请求:向服务端发送数据的 数据放在body里 ...
- 全文检索 使用最新lucene3.0.3+最新盘古分词 pangu2.4 .net 实例
开发环境 vs2015 winform 程序 1 首先需要下载对应的DLL 文章后面统一提供程序下载地址 里面都有 2 配置pangu的参数 也可以不配置 采用默认的即可 3 创建索引,将索引存放到本 ...
- 阿里云服务器 Ubuntu 安装 LNMP
1.设定实例化服务器IP密码. 2.设定安全组件端口 80 和 3306 系统默认提供端口 22. //阿里云需要设定安全组件端口必须设定. 3.安装一键lnmp系统. 教程地址 https://ln ...