[BZOJ 3218]a + b Problem
又是一道主席树优化网络流的好题
按约大爷的教导,源点为白,汇点为黑,搞成最小割
发现暴力连边要爆炸,但是要连的点在线段树中都构成了一个区间,果断主席树优化之
为什么不用一般线段树?
因为要满足 j<i ,这里的可持久化并不是为了查询过去的值,而是为了保留过去的值不与后来弄混~
如果有两个点的 a[i] 相同在线段树里怎么搞?
很简单,从 a[i] 向 a[j] 连一条 inf 的流即可
不过——为什么题目名字那么坑啊啊啊啊啊啊?!!!!!
这种题是不是非要来卡空间不然不痛快是吗?!!!!!
#include <cstdio>
#include <cstring>
const int sizeOfSegment=;
const int sizeOfEdge=;
const int sizeOfPoint=;
const int sizeOfCell=;
const int inf=; inline int min(int, int);
inline int getint();
inline void putint(int); int S, T;
int V;
int n;
int a[sizeOfCell], b[sizeOfCell], w[sizeOfCell], l[sizeOfCell], r[sizeOfCell], p[sizeOfCell]; struct edge {int point, flow; edge * next, * pair;};
edge memory_edge[sizeOfEdge], * port_edge=memory_edge;
edge * e[sizeOfPoint];
inline edge * newedge(int, int, edge * );
inline void link(int, int, int);
int h[sizeOfPoint], gap[sizeOfPoint];
inline bool bfs();
inline int isap(); struct seg {int p; seg * l, * r;};
seg memory_seg[sizeOfSegment], * port_seg=memory_seg;
seg * t;
inline seg * newseg(seg * =NULL);
seg * insert(seg * , int, int, int, int);
void query(seg * , int, int, int, int, int); int main()
{
int ans=; n=getint();
S=; T=n+; V=n+;
for (int i=;i<=n;i++)
{
a[i]=getint(), b[i]=getint(), w[i]=getint(), l[i]=getint(), r[i]=getint(), p[i]=getint();
ans+=b[i]+w[i];
link(S, i, b[i]); link(i, T, w[i]);
link(i, ++V, p[i]);
query(t, , inf, l[i], r[i], V);
t=insert(t, , inf, a[i], i);
} ans-=isap();
putint(ans); return ;
}
inline int min(int x, int y)
{
return x<y?x:y;
}
inline int getint()
{
register int num=;
register char ch;
do ch=getchar(); while (ch<'' || ch>'');
do num=num*+ch-'', ch=getchar(); while (ch>='' && ch<='');
return num;
}
inline void putint(int num)
{
char stack[];
register int top=;
if (num==) stack[top=]='';
for ( ;num;num/=) stack[++top]=num%+'';
for ( ;top;top--) putchar(stack[top]);
putchar('\n');
}
inline edge * newedge(int point, int flow, edge * next)
{
edge * ret=port_edge++;
ret->point=point; ret->flow=flow; ret->next=next;
return ret;
}
inline void link(int u, int v, int f)
{
e[u]=newedge(v, f, e[u]); e[v]=newedge(u, , e[v]);
e[u]->pair=e[v]; e[v]->pair=e[u];
}
inline bool bfs()
{
static int q[sizeOfPoint];
static int l, r;
memset(h, 0xFF, sizeof(h)); h[T]=;
l=r=;
for (q[r++]=T;l<r;l++)
{
int u=q[l];
++gap[h[u]];
for (edge * i=e[u];i;i=i->next) if (h[i->point]==-)
{
h[i->point]=h[u]+;
q[r++]=i->point;
}
}
return h[S]>-;
}
inline int isap()
{
static edge * t[sizeOfPoint], * p[sizeOfPoint];
static int aug[sizeOfPoint];
int flow=, hmin=; if (!bfs()) return ; memcpy(t, e, sizeof(e)); memset(p, , sizeof(p));
aug[S]=inf;
for (int u=S;h[S]<V; )
{
if (u==T)
{
flow+=aug[T];
for (edge * i=p[T];i;i=p[i->point])
aug[i->point]-=aug[T], i->pair->flow-=aug[T], i->flow+=aug[T];
for (edge * i=p[T];i;i=p[i->point]) if (aug[i->point])
{
u=i->point;
break;
}
} edge *& i=t[u];
for ( ;i && (!i->flow || h[i->point]+!=h[u]);i=i->next);
if (i)
{
aug[i->point]=min(aug[u], i->flow); p[i->point]=i->pair;
u=i->point;
}
else
{
if (!--gap[h[u]]) break;
hmin=V;
for (edge * j=e[u];j;j=j->next) if (j->flow && h[j->point]+<hmin)
{
hmin=h[j->point]+;
t[u]=j;
}
++gap[h[u]=hmin];
u=u==S?S:p[u]->point;
}
} return flow;
}
inline seg * newseg(seg * t)
{
seg * newt=port_seg++;
newt->p=++V; newt->l=t?t->l:NULL; newt->r=t?t->r:NULL;
return newt;
}
seg * insert(seg * t, int l, int r, int p, int v)
{
seg * newt=newseg(t);
if (l==r)
{
if (t) link(newt->p, t->p, inf);
link(newt->p, v, inf);
}
else
{
int m=(l+r)>>;
if (p<=m)
{
newt->l=insert(newt->l, l, m, p, v), link(newt->p, newt->l->p, inf);
if (newt->r) link(newt->p, newt->r->p, inf);
}
else
{
newt->r=insert(newt->r, m+, r, p, v), link(newt->p, newt->r->p, inf);
if (newt->l) link(newt->p, newt->l->p, inf);
}
} return newt;
}
void query(seg * t, int l, int r, int ql, int qr, int v)
{
if (!t) return ;
if (l==ql && r==qr) link(v, t->p, inf);
else
{
int m=(l+r)>>;
if (qr<=m) query(t->l, l, m, ql, qr, v);
else if (ql>=m+) query(t->r, m+, r, ql, qr, v);
else query(t->l, l, m, ql, m, v), query(t->r, m+, r, m+, qr, v);
}
}
改数组改到想去死
尝试着用了用 Data Display Debugger 觉得是很强大但是总觉得也很不顺手?
不过反正有了这个我是不想再去用 gdb 了……
[BZOJ 3218]a + b Problem的更多相关文章
- [BZOJ 3218] A + B Problem 【可持久化线段树 + 网络流】
题目连接:BZOJ - 3218 题目分析 题目要求将 n 个点染成黑色或白色,那么我们可以转化为一个最小割模型. 我们规定一个点 i 最后属于 S 集表示染成黑色,属于 T 集表示染成白色,那么对于 ...
- bzoj 3218 a + b Problem(最小割+主席树)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3218 [题意] 给n个格子涂白或黑色,白则wi,黑则bi的好看度,若黑格i存在: 1& ...
- BZOJ.3218.a + b Problem(最小割ISAP 可持久化线段树优化建图)
BZOJ UOJ 首先不考虑奇怪方格的限制,就是类似最大权闭合子图一样建图. 对于奇怪方格的影响,显然可以建一条边\((i\to x,p_i)\),然后由\(x\)向\(1\sim i-1\)中权值在 ...
- bzoj 3218: a + b Problem【主席树+最小割】
直接建图比较显然,是(s,i,w),(i,t,b),(i,i',p),(i,j,inf),然而建出来之后发现边数是n方级别的,显然跑不过去,然后就有一种比较神的思路:把a离散了建一棵权值线段树,然后要 ...
- BZOJ 3218 A + B Problem (可持久化线段树+最小割)
做法见dalao博客 geng4512的博客, 思路就是用线段树上的结点来进行区间连边.因为有一个只能往前面连的限制,所以还要可持久化.(duliu) 一直以来我都是写dinicdinicdinic做 ...
- 【BZOJ 3218】 3218: a + b Problem(最小割+可持久化线段树)
3218: a + b Problem Time Limit: 20 Sec Memory Limit: 40 MBSubmit: 1440 Solved: 545 Description Inp ...
- [BZOJ 2301] [HAOI 2011] Problem b (莫比乌斯反演)(有证明)
[BZOJ 2301] [HAOI 2011] Problem b (莫比乌斯反演)(有证明) 题面 T组询问,每次给出a,b,c,d,k,求\(\sum _{i=a}^b\sum _{j=c}^d[ ...
- BZOJ 3218 UOJ #77 A+B Problem (主席树、最小割)
大名鼎鼎的A+B Problem, 主席树优化最小割-- 调题死活调不对,一怒之下改了一种写法交上去A了,但是改写法之后第4,5个点常数变大很多,于是喜提UOJ全站倒数第三 目前还不知道原来的写法为什 ...
- 「BZOJ 3218」 a + b Problem
题目链接 戳我 \(Solution\) 题目为什么是\(a\ +\ b\ Problem\)啊?这和题面半毛钱关系都没有. 现在来讲一下这题的解法吧,我们首先看看没有奇怪的方格这一个条件吧. 其实没 ...
随机推荐
- linux用户和组管理,/etc/passwd 、/etc/shadow和/etc/group 文件内容解释
与用户相关的系统配置文件主要有/etc/passwd 和/etc/shadow,其中/etc/shadow是用户资讯的加密文件,比如用户的密码口令的加密保存等: /etc/passwd 和/etc/s ...
- JS刷新父窗口的几种方式
浮层内嵌iframe及frame集合窗口,刷新父页面的多种方法 <script language=JavaScript> parent.location.reload(); ...
- 2014年6月份第3周51Aspx源码发布详情
基于知识树的多课程网络教学平台源码 2014-6-16 [VS2008]功能介绍:本平台是一个支持网上教学的网站,支持多个课程,教师可根据需要创建课程,进行课程结构.题库等的管理. 技术特色 ...
- 一篇介绍java与js操作cookie的
http://blog.csdn.net/xuweilinjijis/article/details/8651188
- 内网公告牌获取天气信息解决方案(C# WebForm)
需求:内网公告牌能够正确显示未来三天的天气信息 本文关键字:C#/WebForm/Web定时任务/Ajax跨域 规划: 1.天定时读取百度接口获取天气信息并存储至Txt文档: 2.示牌开启时请求Web ...
- C#获取北京时间与设置系统时间
获取北京时间 public static DateTime GetBeijingTime() { DateTime dt; // 返回国际标准时间 // 只使用 timeServers 的 IP 地址 ...
- C#实现自动发送QQ消息
1.得打开需要发送的聊天窗口,最小化也可,聊天时不能是中文输入法2.然后AIO名就是窗口左上角的那个名称,括号和QQ号不要,那个名称可能是好友备注,群名称,讨论组名称等.3.发送消息要设置成按Ente ...
- _.属性和self.属性,我遇到的那些坑
只怪当时_.属性和self.属性当时没有研究透,所以为自己掉入坑里埋下了伏笔.下面从我的坑开始说起: 我写了个懒加载,重写了一个数组属性的get方法,在get方法里面创建了一个数组来获取数据,那么调用 ...
- 服务器三大体系SMP、NUMA、MPP介绍
从系统架构来看,目前的商用服务器大体可以分为三类,即: 对称多处理器结构(SMP:Symmetric Multi-Processor) 非一致存储访问结构(NUMA:Non-Uniform Memor ...
- IOS 学习之 iOS沙盒(sandbox) 介绍 沙盒机制 文件操作(一)
1.iOS沙盒机制 iOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等. ...