$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(网络流+主席树)的更多相关文章

  1. [bzoj3218]a + b Problem 网络流+主席树优化建图

    3218: a + b Problem Time Limit: 20 Sec  Memory Limit: 40 MBSubmit: 2229  Solved: 836[Submit][Status] ...

  2. Luogu4137 Rmq problem/mex 主席树

    传送门 用主席树水莫队题…… 我们对于前缀和建立主席树,对于主席树中的每一个叶子节点表示它对应的数字最后出现的位置的编号,非叶子节点求左右节点的最小值,那么对于每一次询问$l,r$就是在第$r$棵主席 ...

  3. bzoj3489: A simple rmq problem (主席树)

    //========================== 蒟蒻Macaulish:http://www.cnblogs.com/Macaulish/  转载要声明! //=============== ...

  4. luogu P4137 Rmq Problem / mex 主席树 + 思维

    Code: #include<bits/stdc++.h> #define maxn 200001 using namespace std; void setIO(string s) { ...

  5. 【CF464E】The Classic Problem(主席树+最短路)

    点此看题面 大致题意: 给你一张无向图,每条边的边权为\(2^{x_i}\),求\(s\)到\(t\)的最短路. 最短路 最短路,首先考虑\(Dijkstra\).这里用\(SPFA\)似乎不太好,因 ...

  6. 洛谷$P$4137 $Rmq\ Problem / mex$ 主席树

    正解:主席树 解题报告: 传送门$QwQ$ 本来以为是道入门无脑板子题,,,然后康了眼数据范围发现并没有我想像的那么简单昂$kk$ 这时候看到$n$的范围不大,显然考虑离散化?但是又感觉似乎布星?因为 ...

  7. Codeforces 464E The Classic Problem(主席树+最短路+哈希,神仙题)

    题目链接 题意:给出一张 \(n\) 个点 \(m\) 条边的无向图,第 \(i\) 条边连接 \(u_i,v_i\),边权为 \(2^{w_i}\),求 \(s\) 到 \(t\) 的最短路. \( ...

  8. bzoj 3218: a + b Problem【主席树+最小割】

    直接建图比较显然,是(s,i,w),(i,t,b),(i,i',p),(i,j,inf),然而建出来之后发现边数是n方级别的,显然跑不过去,然后就有一种比较神的思路:把a离散了建一棵权值线段树,然后要 ...

  9. 洛谷 p3834 主席树

    题目链接:https://www.luogu.org/problem/P3834 主席树求静态区间第k小 #include<iostream> #include<cstdio> ...

随机推荐

  1. 2018-8-28-win10-uwp-MVVM入门

    title author date CreateTime categories win10 uwp MVVM入门 lindexi 2018-08-28 15:37:52 +0800 2018-2-13 ...

  2. Maya多版本下载与激活方法

    目录 1. 安装激活说明 1. 安装激活说明 Maya2019:https://www.cnblogs.com/coco56/p/11425559.html Maya2017:https://www. ...

  3. java调用sqlldr报错:Message 2100 not found

    java调用Oracle的sqlldr命令报错:Message 2100 not found; No message file for product=RDBMS, facility=ULMessag ...

  4. Feign Dynamic URL

    原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11811932.html Project Directory Maven Dependency < ...

  5. 如何在mac上使用iMessage发送信息

    在Mac上你也可以像iPhone上一样使用iMessage 来发送iMessage 与 普通的短信息. 并且你需要在iPhone上设置中的信息的信息转发中激活对电脑的支持.此时, 你的电脑也可以向你的 ...

  6. 两个list 合并后去除掉重复removeAll()的,然后再随机获取最后list中的 几个值

    public static void test1(){ String s1="1,2,5,3,6,9"; String n1[]=s1.split(","); ...

  7. [CF-GYM]Abu Tahun Mod problem题解

    前言 这道题比较简单,但我还是想了好一会 题意简述 Abu Tahun很喜欢回文. 一个数组若是回文的,那么它从前往后读和从后往前读都是一样的,比如数组\(\left\{1\right\},\left ...

  8. Eclipse中安装和使用FindBugs

    FindBugs在Eclipse的离线安装:   1 到http://findbugs.sourceforge.net/downloads.html下载20131115123549_nlpir_ict ...

  9. 冲刺CSP-S集训考试反思+其它乱写(密码私信)

    RT.开坑. 10.1 开门黑23333. 放假回来稍困,而且感冒似乎愈加严重,导致我正常考试基本睁不开眼.一个小时勉强把题读懂,神志恍惚如斯. 看T2觉得估计又是各种推柿子堆定理的数学大题,写了个暴 ...

  10. php输出控制函数和输出函数生成静态页面

    Output Control 函数详解: flush - 刷新输出缓冲 ob_clean - 清空输出缓冲区 ob_end_clean - 清空缓冲区并关闭输出缓冲 ob_end_flush - 冲刷 ...