做法见dalao博客 geng4512的博客, 思路就是用线段树上的结点来进行区间连边.因为有一个只能往前面连的限制,所以还要可持久化.(duliu) 一直以来我都是写dinicdinicdinic做最大流,感觉加上弧优化等等效率还是蛮高的-但是这道题点数边数都是 nlognlognlog 级别的,让我发现还是SAP(ISAP?SAP(ISAP?SAP(ISAP?)最快啊- 这是dinicdinicdinic AC代码(加上弧优化 4112 ms, 不加 4072 ms) #include <c…
[BZOJ 3123] [SDOI 2013]森林(可持久化线段树+启发式合并) 题面 给出一个n个节点m条边的森林,每个节点都有一个权值.有两种操作: Q x y k查询点x到点y路径上所有的权值中,第k小的权值是多少.此操作保证点x和点y连通,同时这两个节点的路径上至少有k个点. L x y在点x和点y之间连接一条边.保证完成此操作后,仍然是一片森林. 分析 用并查集维护连通性以及每个联通块的大小 用主席树维护路径上第k大,第x棵主席树维护的是节点x到根的链上权值的出现情况,类似[BZOJ2…
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就行了…
BZOJ 洛谷 求中位数除了\(sort\)还有什么方法?二分一个数\(x\),把\(<x\)的数全设成\(-1\),\(\geq x\)的数设成\(1\),判断序列和是否非负. 对于询问\((a,b,c,d)\),同样也可以二分中位数\(x\),然后把原序列对应地改为\(+1\)或\(-1\). 此时区间\([b,c]\)中的数是必选的,求一个和\(sum\).显然对于区间\([a,b-1]\),我们可以求一个和最大的后缀:对于区间\([c+1,d]\),可以求一个和最大的前缀.然后判断总和是…
[BZOJ3218]a + b Problem 题解:思路很简单,直接最小割.S->i,容量为Bi:i->T,容量为Wi:所有符合条件的j->new,容量inf:new->i,容量Pi. 但是符合条件的j有很多,并且限制有二维,所以用可持久化线段树优化建图即可. #include <cstdio> #include <cstring> #include <iostream> #include <queue> #include <…
首先嘛,还是太弱了,想了好久QAQ 然后,这道题么,明显就是求sigma(size[x]) (x是y的儿子且层树小于k) 然后就可以发现:把前n个节点按深度建可持久化线段树,就能用前缀和维护了 其实不难打= = #include<cstdio> #include<iostream> #include<cstring> #include<algorithm> using namespace std; #define maxn 300010 #define ma…
题目: Description 兔子们在玩k个串的游戏.首先,它们拿出了一个长度为n的数字序列,选出其中的一 个连续子串,然后统计其子串中所有数字之和(注意这里重复出现的数字只被统计一次). 兔子们想知道,在这个数字序列所有连续的子串中,按照以上方式统计其所有数字之和,第 k大的和是多少. Input 第一行,两个整数n和k,分别表示长度为n的数字序列和想要统计的第k大的和 接下里一行n个数a_i,表示这个数字序列 Output 一行一个整数,表示第k大的和 Sample Input 7 5 3…
题目大意: N个点M条边的无向图,询问保留图中编号在[l,r]的边的时候图中的联通块个数. 题解: 这道题考试的时候没想出来 于是便爆炸了 结果今天下午拿出昨天准备的题表准备做题的时候 题表里就有这题.. 欲哭无泪啊有木有... ... 说正经的 假设我们可以做到用并查集实现区间减法 那么很显然的做法就是维护前缀并查集然后做差 但是并查集并不满足区间减法. 但是我们可以考虑一下如果并查集满足区间减法,那我们会拿它做什么 我们对并查集做差实际上就是想使并查集\([1,R]\)退回到删除掉\([1,…
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3524 [题目大意] 给一个长度为n的序列a.1≤a[i]≤n. m组询问,每次询问一个区间[l,r],是否存在一个数在[l,r]中出现的次数大于(r-l+1)/2. 如果存在,输出这个数,否则输出0. [题解] 建立可持久化的权值线段树,对于区间查询, 在线段树上二分查询R和L-1版本间的数值差符合要求的位置. [代码] #include <cstdio> #include <…
题目大意:有一个序列,包含多次询问.询问区间左右端点在规定区间里移动所得到的最大中位数的值. 考虑对于每个询问,如何得到最优区间?枚举显然是超时的,只能考虑二分. 中位数的定义是在一个序列中,比中位数小的数跟比它大的数一样多,由于我们要求的是最大的中位数,自然希望能找到一个区间,使得该区间内比该中位数大的数尽量多. 二分中位数k,假设比k小的数记为-1,其余的数记为1,那么我们就是要寻找最大连续子序列和,若找到的最大的和>=0,则当前的k就是合法的. 最大连续子序列和可以用线段树来维护,由于存在…