线段树
文章平均质量分 76
neither_nor
这个作者很懒,什么都没留下…
展开
-
UOJ#218 【UNR #1】火车管理
遥想当年,xuruifan想用线段树套可持久化treap日这题,结果最后也只得了80分……为了不步xuruifan的后尘,我orz了题解我们可以用一个线段树来维护当前的所有栈顶元素,支持区间覆盖和区间求和然后我们维护一个主席树,维护每个版本的时候的栈顶元素,并维护每个栈顶元素被加入是在哪个版本,这样在区间压栈的时候我们可以区间赋值,在单点弹栈的时候我们可以先查到栈顶元素被加入的版本,然原创 2016-12-09 11:15:07 · 902 阅读 · 4 评论 -
BZOJ4712 洪水
永恒的一氧化碳大爷在讨论版里发了个单log的做法,还没来得及看……先写个链剖再说考虑没有修改的情况,我们可以树DP,f[x]表示把x的子树截断的最小代价,v[x]表示截断每个点的代价,然后我们求出每个点的s[x],代表x的所有儿子节点的f之和,f[x]就等于min(v[x],s[x])考虑修改,一次修改操作后,v[x]会增加,f[x]可能增加,可能不变,如果f[x]增加了d,那么从x到原创 2016-11-07 10:22:16 · 1480 阅读 · 0 评论 -
BZOJ2951 [Poi2001]Goldmine
把所有点按x坐标排序,然后双指针扫一下,一个指针扫右边界,另一个扫当前右边界的时候的最靠左的左边界,线段树维护每个下边界的答案#include#include#include#include#include#include#include#include#include#include#include#include#include#includeusing nam原创 2016-09-29 13:35:37 · 585 阅读 · 0 评论 -
BZOJ3521 [Poi2014]Salad Bar
把p看作1,j看作-1,作前缀和数组s,那么一个区间[l,r]合法的条件就是对于任意的l=s[l-1],s[i-1]那么对于每个点单调栈求出前边第一个比他大的在哪low,后边第一个比他小的在哪far,然后枚举i作为右端点,然后线段树查从low到i中far比i大的最靠前的那个即可#include#include#include#include#include#include#in原创 2016-09-27 13:20:04 · 572 阅读 · 0 评论 -
BZOJ1135 [POI2009]Lyz
这个,二分图完备匹配模型然后呢,上hall定理发现肯定是选择脚号为一个区间的人的话最可能不满足hall定理设a[x]为x号脚的人的数量那么假设选择区间[l,r],我们要满足sigma i=l to r a[x]即sigma i=l to r (a[x]-k)那么线段树维护最大连续和即可#include#include#include#include#includ原创 2016-09-24 10:39:05 · 985 阅读 · 0 评论 -
BZOJ4373 算术天才⑨与等差数列
考虑一段区间排序后是等差为k的数列的条件首先特判k=0,如果区间最大值与最小值相等则合法否则首先区间不能有重复,记录每个点的上一个与他权值相等的点的位置fro,区间取fro最大值之后判断是否在区间左边然后设区间长度为len,则区间最大值必须等于区间最小值+(len-1)*k满足上边两个条件之后,只要满足区间内每个点的权值模k都相等即可考虑求关于x的同余方程a同余b模x的解,则原创 2016-09-07 18:10:12 · 973 阅读 · 0 评论 -
BZOJ3702/2212 [Poi2011]Tree Rotations/二叉树
双倍经验题……首先两个子树内怎么排列对两个子树之间产生的逆序对没有影响,所以对于每个节点都要选择交换或者不交换,使得这两个子树形成的逆序对数最小,全局逆序对数就最小了每个点维护一个权值线段树,里边是子树里的权值,非叶子节点的等于两个儿子节点的线段树合并,而我们在合并的过程中就可以算出来逆序对数复杂度O(n log n)#include#include#include#incl原创 2016-08-15 12:31:24 · 419 阅读 · 0 评论 -
BZOJ2962 序列操作
看这数据范围,我还以为是分块……分完了块发现复杂度n根号n*400根本过不了,然后发现根本不用分块,直接线段树就行了 每个区间维护c=0到20的时候的答案,认为当c=0时答案为1 合并两个区间的时候就枚举左边选i个右边选j个,乘起来加到选i+j的答案上去,类似卷积 考虑如何打两个修改操作的标记 首先说翻转操作,把所有c为奇数的答案取反,把加标记取反,就可以了,下传的时候先传翻转再传原创 2016-09-04 19:52:46 · 725 阅读 · 0 评论 -
BZOJ3387 [Usaco2004 Dec]Fence Obstacle Course栅栏行动
按纵坐标从小到大顺序加入每个栅栏,用线段树维护从每个横坐标,纵坐标正无穷处走到0,0的答案,加入一个栅栏,一定是这段区间左边一段往左走,右边一段往右走,分界点可以算出来,两边都分别相当于给答案进行区间赋值再区间加等差数列,线段树搞就行了#include#include#include#include#include#include#include#include#include原创 2016-08-12 16:14:22 · 467 阅读 · 0 评论 -
BZOJ4134 ljw和lzr的hack比赛
今年清华集训D1T1-_-首先我们可以想到n^2的算法,我们对每个点记录一个sg[x],代表以x为根的子树的游戏的sg函数值,然后我们再对每个点记录rem[x],代表删掉从x到根的路径后剩余的游戏的sg值的异或和。容易发现在我们计算x的sg值的时候,x的rem是他所有儿子的sg值的异或和,而对于x的每一个儿子y,y的子树里的所有rem值都会异或rem[x]^sg[y]然后我们求第一个不原创 2016-12-09 08:59:27 · 1232 阅读 · 0 评论 -
BZOJ4345 [POI2016]Korale
在病房里日题真是一种独特的体验……首先考虑求第一问,我们先把所有元素排序,我们用优先队列维护选数的集合,对每个集合维护集合里的元素的和v和最后一个元素(即最大的元素)lst,初始的时候我们把只包含最小元素的集合推入队列,那么我们取出一个队头元素之后,如果队头的lst不是最大的元素,我们只需要再向队列里推入当前集合插入lst+1后的集合以及先删除lst再插入lst+1的集合。如果lst是最大元素原创 2016-12-17 21:30:49 · 1195 阅读 · 2 评论 -
BZOJ3702 二叉树
对于每一个节点,保证这个子树代表的区间里逆序对数最少,即能保证答案最小,因为两颗互不包含的子树内部的顺序与一颗子树对另一颗子树的贡献无关对每个叶子节点建一个权值线段树,对每个非叶子节点合并他的两个儿子节点的线段树,合并的时候通过siz[son[x][0]]*siz[son[y][1]]和siz[son[x][1]]*siz[son[x][0]]算出左儿子在前和右儿子在前时候的子树内逆序对数,用原创 2016-05-12 16:26:56 · 555 阅读 · 0 评论 -
BZOJ4817 [Sdoi2017]树点涂色
BZOJ3779重组病毒弱化版注意到染色相当于在LCT上access这个点,一个点到根路径上颜色段数就是LCT上虚边的个数在access的时候同时在线段树上维护一下子树加减即可2操作就算出来两个点到根的答案,再减去LCA到根的答案*2,交界的地方特殊算算第三问就之间线段树询问区间最值就行#include#include#include#include#include#原创 2017-04-11 17:12:34 · 488 阅读 · 0 评论 -
BZOJ3073 [Pa2011]Journeys
一眼线段树优化建图01bfs考虑一下怎么优化搞两棵线段树,线段树上的边都是0,对于一次新建一个单向边(题里建的是双向边,拆成俩单向边即可),新建两个点,两个点之间连一个边权为1的,然后第一颗线段树对应区间的点连第一个新建的点边权0,第二个新建的点连第二棵线段树对应区间的点边权0第二个线段树的每个叶子向第一个线段树的对应叶子连边权0然后跑01bfs即可#include#incl原创 2017-03-29 14:55:58 · 521 阅读 · 0 评论 -
BZOJ1835 [ZJOI2010]base 基站选址
搜了一下,被告知是线段树优化dp那么就瞎YY一下考虑f[i][j]表示第村庄i建一个基站,1~i一共建了j个基站,前i个村庄的总代价最小是多少那么我们可以考虑枚举倒数第二个基站进行转移考虑补偿带来的代价,因为只考虑前i个村庄,所以也只考虑前i个村庄补偿带来的代价每个村庄会对应一段区间,只要这个区间里有基站那么就不用补偿那么考虑每如果i大于某一个村庄j的区间的右端点,那么在计原创 2017-03-21 18:15:55 · 706 阅读 · 0 评论 -
BZOJ4293 [PA2015]Siano
看题第一反应:区间加固定数列,区间取min?仔细想想,发现顺序其实无所谓,那么我们不妨按a排序这样的话不管怎样数列都是单调不降的,每次取min影响的也只有一段后缀那么就变成了加固定数列和赋值在线段树上爬找到赋值的分界点即可#include#include#include#include#include#include#include#include#includ原创 2017-03-29 09:37:31 · 731 阅读 · 0 评论 -
BZOJ4730 UOJ#266【清华集训2016】Alice和Bob又在玩游戏
同BZOJ4134-_-#include#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;#define MAXN 200010#define MAXM 400001原创 2016-12-26 15:50:45 · 1015 阅读 · 0 评论 -
BZOJ3999 [TJOI2015]旅游
水题……链剖然后维护区间最大值,最小值,和区间从左往右走的答案,还有从右往左走的答案即可#include#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;#define原创 2016-12-29 19:21:10 · 1021 阅读 · 0 评论 -
BZOJ2770 YY的Treap
答案就等于两个点之间priority最小那个……线段树维护一下即可。由定义就能得出来嘛#include#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;#define原创 2017-01-03 07:22:56 · 513 阅读 · 0 评论 -
UOJ#228 基础数据结构练习题
区间加操作正常做,考虑开根操作,维护区间最大最小值,如果区间的最大最小值开根后相同,则直接区间赋值,如果不同但最大值为最小值加1,则区间加上根号最小值减最小值,否则递归下去考虑这个算法的复杂度,如果两个相邻的点导致包括这两个点的区间必须要从这里分成两边才能处理开根操作(即两个数开根后不同且大的那个不为小的那个+1),则称为一个分界点,一个分界点相当于把一次开根拆成两次,若不考虑区间加操作,由于原创 2016-08-15 09:05:30 · 1744 阅读 · 0 评论 -
BZOJ3790 神奇项链
manacher求出所有极长回文串的左右端点,然后求最少几段区间能覆盖整个串即可#include#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;#define MAX原创 2016-09-02 14:43:49 · 917 阅读 · 0 评论 -
BZOJ3441 乌鸦喝水
这题我想了一周……然后今天我发现,我,T,M,看,错,题,啦!!!日了狗算出每个瓶子被喝多少次之后会喝不了然后把瓶子按这个排序然后枚举第几次飞,看当前瓶子是不是在当前这一次被喝没,拿个线段树记录一下区间和乱搞就行了#include#include#include#include#include#include#include#include#include#i原创 2016-08-31 18:54:16 · 1085 阅读 · 0 评论 -
BZOJ3252 攻略
因为是在树上,所以一定不会走反向边每次我们要在树上找一个到根路径上点权和最大的点,把答案加上这个和,然后把到根路径上所有点的点权设为0因为每个点的点权只会变为0一次,所以我们可以暴力做这个过程复杂度O((n+k)log n)#include#include#include#include#include#include#include#include#include原创 2016-07-13 16:51:22 · 743 阅读 · 0 评论 -
BZOJ4627 [BeiJing2016]回转寿司
求前缀和,相当于对于每个i求1#include#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;#define MAXN 100010#define MAXM 800原创 2016-07-01 12:05:34 · 1255 阅读 · 0 评论 -
BZOJ3065 带插入区间K小值
用替罪羊树套权值线段树,每个权值线段树维护替罪羊树上子树内的数,插入的时候直接插,不平衡重建,修改直接改,查询的时候在替罪羊树上把代表区间的子树和单点爬出来然后查询暴力重建的时候如果用线段树合并据说是log^2的,但是我不知道这题怎么合并,于是我写了爆插,据说是log^3的内存要写回收最开始建树的时候不建议爆插,有点慢#include#include#include#incl原创 2016-06-14 15:12:42 · 700 阅读 · 0 评论 -
BZOJ3155 Preprefix sum
一个数相当于给他后边的前缀和序列加了一个等差数列直接线段树#include#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;#define MAXN 100010原创 2016-07-11 20:00:03 · 494 阅读 · 0 评论 -
BZOJ4592 [Shoi2015]脑洞治疗仪
进行治疗实际上相当于用1覆盖一段区间,这段区间内原有的1的个数加上挖出来的1的个数等于这段区间的长度,并且这段区间的长度最长为治疗的区间长度记录一下还剩多少挖出来的1,然后在线段树上爬出这个区间就可以了,因为是线段树上,所以找到一个区间是log的知道了一段区间的长度,区间里有多少1,还剩多少脑组织,就能知道这段区间是否被完全覆盖需要判断是否还剩脑组织,如果没了就返回,要不然复杂度不对原创 2016-06-12 07:37:44 · 767 阅读 · 0 评论 -
BZOJ4597 [Shoi2016]随机序列
发现对于除了全是乘法之外的任意一个序列,有一个与之一一对应的序列,两个序列相加后除了第一项全部抵消,所以只有前缀积被记入答案,第n个元素的前缀积被计算了一次,对于1更改一个数相当于对他和他后面的所有前缀积乘上这个数的逆元再乘上新数线段树维护即可#include#include#include#include#include#include#include#include原创 2016-05-18 16:04:22 · 761 阅读 · 0 评论 -
BZOJ3545 [ONTAK2010]Peaks
考虑离线,按权值限制从小到大计算答案,对每个点维护一颗权值线段树,每次计算答案之前将边权小于等于限制的边两端的连通块的权值线段树合并,然后在权值线段树上查询即可#include#include#include#include#include#include#include#include#include#include#include#include#include#原创 2016-05-13 16:24:22 · 511 阅读 · 0 评论 -
BZOJ4552 [Tjoi2016&Heoi2016]排序
BC#76原题……二分答案,把小于等于mid的设成零,大于mid的设成1,然后排序可视为区间赋值和区间求和,可用线段树做当mid大于等于答案的时候,最后p的位置一定是0,当mid小于答案的时候,p的位置一定是1,所以满足可二分性复杂度O(n log^2 n)#include#include#include#include#include#include#include原创 2016-05-13 09:09:50 · 1358 阅读 · 0 评论 -
BZOJ4199 [Noi2015]品酒大会
建一个后缀树,dfs一遍维护子树里有多少个后缀,子数内最大次大最小次小,用siz[x]*(siz[x]-1)/2可以更新mx[fa[x]]+1~mx[x]这段的选法,用max(mx1[x]*mx2[x],mn1[x]*mn2[x])可以更新mx[fa[x]]+1~mx[x]这段的最大值,拿个线段树维护一下,然后爬一遍线段树就可以了感觉自从学会了后缀数组半个月之后学会了后缀自动机就再也没打过后缀原创 2016-06-16 19:09:37 · 590 阅读 · 0 评论 -
BZOJ4636 蒟蒻的数列
水题,造个线段树,把标记打线段树上,然后dfs一遍就行了a可能等于b,判掉就好#include#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;#define MA原创 2016-07-04 15:19:56 · 1070 阅读 · 0 评论 -
BZOJ3922 Karin的弹幕
考虑把询问的公差大的和小的分别考虑,大的直接暴力,对于小的公差,我们每个公差建一个1~N的线段树,维护1,1+i,1+2i...2,2+i,..3,3+i上的权值,这样一个等差序列就转换成一段区间,线段树上查就好了讲道理这个算法取公差按根号分最优,复杂度是n sqrt n log n的……但是我们按5分,然后很快就过去了……#include#include#include#inclu原创 2016-08-19 15:55:39 · 569 阅读 · 0 评论 -
BZOJ3526 [Poi2014]Card
线段树维护区间以较小的数开头,结尾最小是多少以及区间以较大的数开头,结尾最小是多少(同时维护是否无解)然后就可以判了#include#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namesp原创 2016-08-17 18:54:10 · 647 阅读 · 0 评论 -
BZOJ1577 [Usaco2009 Feb]庙会捷运Fair Shuttle
按结束点排序,然后能塞多少塞多少即可#include#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;#define MAXN 50010#define MAXM 2原创 2016-08-27 12:13:39 · 1505 阅读 · 0 评论 -
BZOJ1798 [Ahoi2009]Seq 维护序列seq
傻逼题……#include#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;#define MAXN 100010#define MAXM 1010#define原创 2016-08-17 14:19:19 · 254 阅读 · 0 评论 -
BZOJ1858 [Scoi2010]序列操作
傻逼题……维护0和1的左最长右最长和最长还有和,打覆盖标和翻转标即可#include#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;#define MAXN 10原创 2016-08-17 13:54:30 · 423 阅读 · 0 评论 -
BZOJ4653 [Noi2016]区间
把区间按长度排序,我们发现对于每个区间,假设以其为最长区间,并保证当前存在一个点被m个区间覆盖的话,那么最短那个区间是不降的,所以我们排序后挨个进行区间+1操作,然后再维护一个指针代表当前的最短区间,指针往后扫同时进行区间-1操作直到当前最大值不大于m,期间更新答案,用一个线段树维护区间加和全局最大值即可区间要离散化一下#include#include#include#include原创 2016-08-04 10:57:21 · 1448 阅读 · 0 评论 -
BZOJ1273 [BeiJingWc2008]序列
由于是全局加,所以对于所有的加操作我们可以用一个变量X记录下来对于x和X,如果(x+X)&2^i==1的话就说明x+X二进制展开之后的从第i-1位开始的后缀在2^i到2^(i+1)-1之间,也就是x在2^i-X到2^(i+1)-1-X之间(模2^(i+1)意义下)所以对于所有长度的后缀分别开一个权值线段树,然后查询就可以了#include#include#include#includ原创 2016-07-06 11:58:08 · 557 阅读 · 0 评论 -
BZOJ4415 [Shoi2013]发牌
水题……拿个变量维护一下当前牌堆顶是第几个,然后就是求第k个并删除上来写了个Splay结果T了……粘了大爷的输出优化也不过,改成权值线段树,A了……#include#include#include#include#include#include#include#include#include#include#include#include#include#incl原创 2016-07-04 16:37:16 · 700 阅读 · 0 评论