UOJ#77. A+B Problem [可持久化线段树优化建边 最小割]
UOJ#77. A+B Problem
题意:自己看
接触过线段树优化建图后思路不难想,细节要处理好
乱建图无果后想到最小割
白色和黑色只能选一个,割掉一个就行了
之前选白色必须额外割掉一个p[i],i向i+n连p[i],然后i+n向之前点连INF就行了
向一段区间连边?果断线段树优化
等等,还要满足\(l_i\le a_j \le r_i\),权值建线段树,然后可持久化!
有一点细节没考虑好,就是之前的可能有x了这次a[i]=x,不需要重复把之前再连一遍,**只要新叶子到之前的叶子连INF就行了**
然后WA了一个小时,除了图上编号手残打错之外,一个主要的问题在于,可持久化线段树是动态开点,建树时父亲向孩子连边,不能在插入孩子的时候连边,有可能是之前的孩子,所以额外判断!!!
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define fir first
#define sec second
#define lc t[x].l
#define rc t[x].r
#define mid ((l+r)>>1)
#define lson lc, l, mid
#define rson rc, mid+1, r
typedef long long ll;
const int N=2e5+5, M=1e6+5, INF=1e9;
inline ll read(){
char c=getchar();ll x=0,f=1;
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
return x*f;
}
int n, s, t, tot, mp[N], m, n2, b, w, p, sum;
struct meow{int a, l, r;}a[N];
struct edge{int v, c, f, ne;}e[M];
int cnt=1, h[N];
inline void ins(int u, int v, int c) { //printf("ins %d %d %d\n",u,v,c);
e[++cnt]=(edge){v, c, 0, h[u]}; h[u]=cnt;
e[++cnt]=(edge){u, 0, 0, h[v]}; h[v]=cnt;
}
namespace Flow{
int q[N], head, tail, vis[N], d[N], cur[N];
bool bfs(int s, int t) {
memset(vis, 0, sizeof(vis));
head=tail=1;
q[tail++]=s; d[s]=0; vis[s]=1;
while(head!=tail) {
int u=q[head++];
for(int i=h[u];i;i=e[i].ne)
if(!vis[e[i].v] && e[i].c>e[i].f) {
vis[e[i].v]=1; d[e[i].v]=d[u]+1;
q[tail++]=e[i].v;
if(e[i].v==t) return true;
}
}
return false;
}
int dfs(int u, int a, int t) {
if(u==t || a==0) return a;
int flow=0, f;
for(int &i=cur[u];i;i=e[i].ne)
if(d[e[i].v]==d[u]+1 && (f=dfs(e[i].v, min(a, e[i].c-e[i].f), t))>0) {
flow+=f;
e[i].f+=f;
e[i^1].f-=f;
a-=f;
if(a==0) break;
}
if(a) d[u]=-1;
return flow;
}
int dinic(int s, int t) {
int flow=0;
while(bfs(s, t)) {
for(int i=0; i<=tot; i++) cur[i]=h[i];
flow+=dfs(s, INF, t); //printf("flow %d\n",flow);
}
return flow;
}
}using Flow::dinic;
namespace Chair{
struct meow{int l, r;}t[N];
int sz, root[N];
void insert(int &x, int l, int r, int val, int id) {
int last=x;
t[++sz]=t[x]; x=sz;
if(l==r) {
if(last) ins(n2+x, n2+last, INF);
ins(n2+x, id, INF);
return;
}
if(val<=mid) insert(lson, val, id);
else insert(rson, val, id);
if(lc) ins(n2+x, n2+lc, INF);
if(rc) ins(n2+x, n2+rc, INF);
}
void rabit(int x, int l, int r, int ql, int qr, int u) {
if(!x) return;
if(ql<=l && r<=qr) ins(u, n2+x, INF);
else {
if(ql<=mid) rabit(lson, ql, qr, u);
if(mid<qr ) rabit(rson, ql, qr, u);
}
}
void build() {
for(int i=1; i<=n; i++) root[i]=root[i-1], insert(root[i], 1, m, a[i].a, i);
for(int i=2; i<=n; i++) rabit(root[i-1], 1, m, a[i].l, a[i].r, i+n);
tot=sz+n2+1;
}
}using Chair::build;
int main() {
freopen("in","r",stdin);
n=read(); s=0; t=N-1;
n2=n*2;
for(int i=1; i<=n; i++) {
mp[++m]=a[i].a=read(), b=read(), w=read(), mp[++m]=a[i].l=read(), mp[++m]=a[i].r=read(), p=read();
ins(s, i, b); ins(i, t, w); ins(i, i+n, p); sum+=b+w;
}
sort(mp+1, mp+1+m); m=unique(mp+1, mp+1+m)-mp-1;
for(int i=1; i<=n; i++) {
a[i].a = lower_bound(mp+1, mp+1+m, a[i].a)-mp;
a[i].l = lower_bound(mp+1, mp+1+m, a[i].l)-mp;
a[i].r = lower_bound(mp+1, mp+1+m, a[i].r)-mp;
// printf("hi %d %d %d %d\n",i,a[i].a,a[i].l,a[i].r);
}
build();
int ans=dinic(s, t); //printf("sum %d %d\n",sum,ans);
printf("%d",sum-ans);
}
UOJ#77. A+B Problem [可持久化线段树优化建边 最小割]的更多相关文章
- 【BZOJ3681】Arietta 树链剖分+可持久化线段树优化建图+网络流
[BZOJ3681]Arietta Description Arietta 的命运与她的妹妹不同,在她的妹妹已经走进学院的时候,她仍然留在山村中.但是她从未停止过和恋人 Velding 的书信往来.一 ...
- P5331 [SNOI2019]通信 [线段树优化建图+最小费用最大流]
这题真让人自闭-我EK费用流已经死了?- (去掉define int long long就过了) 我建的边害死我的 spfa 还是spfa已经死了? 按费用流的套路来 首先呢 把点 \(i\) 拆成两 ...
- BZOJ.3218.a + b Problem(最小割ISAP 可持久化线段树优化建图)
BZOJ UOJ 首先不考虑奇怪方格的限制,就是类似最大权闭合子图一样建图. 对于奇怪方格的影响,显然可以建一条边\((i\to x,p_i)\),然后由\(x\)向\(1\sim i-1\)中权值在 ...
- 【BZOJ3218】a + b Problem 可持久化线段树优化建图
[BZOJ3218]a + b Problem 题解:思路很简单,直接最小割.S->i,容量为Bi:i->T,容量为Wi:所有符合条件的j->new,容量inf:new->i, ...
- bzoj5017 [Snoi2017]炸弹 (线段树优化建图+)tarjan 缩点+拓扑排序
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=5017 题解 这个题目方法挺多的. 线段树优化建图 线段树优化建图的做法应该挺显然的,一个炸弹能 ...
- Codeforces 1045. A. Last chance(网络流 + 线段树优化建边)
题意 给你 \(n\) 个武器,\(m\) 个敌人,问你最多消灭多少个敌人,并输出方案. 总共有三种武器. SQL 火箭 - 能消灭给你集合中的一个敌人 \(\sum |S| \le 100000\) ...
- BZOJ5017 [SNOI2017]炸弹 - 线段树优化建图+Tarjan
Solution 一个点向一个区间内的所有点连边, 可以用线段树优化建图来优化 : 前置技能传送门 然后就得到一个有向图, 一个联通块内的炸弹可以互相引爆, 所以进行缩点变成$DAG$ 然后拓扑排序. ...
- 洛谷P3588 [POI2015]PUS(线段树优化建图)
题面 传送门 题解 先考虑暴力怎么做,我们把所有\(r-l+1-k\)中的点向\(x\)连有向边,表示\(x\)必须比它们大,那么如果这张图有环显然就无解了,否则的话我们跑一个多源最短路,每个点的\( ...
- 【ARC069F】Flags 2-sat+线段树优化建图+二分
Description 数轴上有 n 个旗子,第 ii 个可以插在坐标 xi或者 yi,最大化两两旗子之间的最小距离. Input 第一行一个整数 N. 接下来 N 行每行两个整数 xi, ...
随机推荐
- iOS扩展——Objective-C开发编程规范
最近准备开始系统学习一个完整项目的开发流程和思路,在此之前,我们需要对iOS的开发变成规范进行更系统和详尽的学习,随意对编程规范进行了整理和学习.本文内容主要转载自:Objective-C-Codin ...
- Win10下安装RabbitMQ以及基本知识学习
一.为什么选择RabbitMQ? 先说一下场景,这是我们公司遇到,当然我这里不做业务评价哈?虽然我知道他很不合理,但是我是无能为力的.APP端部分注册是Java开发的系统,然后业务端是C#开 ...
- windows 命令直接搜索局域网计算机的ip
以前都不知道还可以这样.....孤陋寡闻了... cmd 中 输入 net view ,搜索局域网或域中的计算机名. 找到要查询ip地址的计算机名后右键 标记,接着ping 一下,要用 -4 这个参数 ...
- 同一台电脑使用 gitlab 和 github 配置
Git 客户端与服务器端的通信支持多种协议,ssh 最常用.ssh的公钥登录流程,用户将自己的公钥存储在远程主机,登录时,远程主机会向用户发送一条消息,用户用自己的私钥加密后,再发给服务器.远程主机用 ...
- 程序员之殇 —— (The Beginning of the End)噩梦、崩坏
Look at all those faces out there (当我环视周遭的一张张脸孔) We are so different(我们是如此的不同) But we have one thing ...
- php(ThinkPHP)实现微信小程序的登录过程
源码也在我的github中给出 https://github.com/wulongtao/think-wxminihelper 下面结合thinkPHP框架来实现以下微信小程序的登录流程,这些流程是结 ...
- encodeURIComponent() 函数
https://baike.baidu.com/item/encodeURIComponent() 函数/7418815?fr=aladdin encodeURIComponent() 函数[1] 作 ...
- asp.net -mvc框架复习(2)-创建ASP.NET MVC 第一个程序以及MVC项目文件夹说明
建议vs2013或2013以上版本的vs,要是跨平台的话最好用vs2015或vs2017的asp.net mvc core . 1.创建ASP.NET MVC 第一个程序 打开vs2013->文 ...
- UML学习网址列表
在线绘图工具ProcessOn:https://www.processon.com/support#mind-format 鲁棒图实例:http://blog.csdn.net/joeyon1985/ ...
- python 实现词云
拿现在比较火的小说<大主宰>做测试,看看其中的关键词词云是啥 代码 import matplotlib.pyplot as plt from wordcloud import WordCl ...