
线段树/树状数组
jzq233jzq
这个作者很懒,什么都没留下…
展开
-
线段树——BZOJ1858/Luogu2572 [SCOI2010]序列操作
题面:Luogu2572 BZOJ1858 (傻逼)题? 我不会告诉你我写了调了一个晚上才A掉。。。(逃 思路真的挺简(sha)单(bi),其实就是线段树维护区间和,区间最长连续段。 但是细节实在太多。。。代码太难写。。。 首先关于这个标记的问题,覆盖标记的优先级比反转的高,所以我们一旦加上覆盖标记之后,这个节点之前有的标记都可以清除掉了。。。 还有,如果在这个节点加上反转标记的时候,这原创 2017-08-16 23:02:21 · 264 阅读 · 0 评论 -
树套树——BZOJ3110/Luogu3332 [ZJOI2013]K大数查询
http://www.lydsy.com/JudgeOnline/problem.php?id=3110 https://www.luogu.org/problem/show?pid=3332 带插入的区间k值啊。。。 这个啊,用主席树我不会做,这个我只会树套树 外层权值线段树,内层区间线段树 把k大改成k小很简单,取反即可哦 然后介绍一下思路 外层修改和查找时的过程等同于找链,类似于原创 2017-04-06 14:53:41 · 459 阅读 · 1 评论 -
主席树——BZOJ3673/BZOJ3674 可持久化并查集(加强版)
http://www.lydsy.com/JudgeOnline/problem.php?id=3674 据说3673因为没有加强版而直接用暴力水掉了? 用主席树可以搞出来一个可持久化数组,然后就可以干很多的事情…… 于是我们可以维护一个可持久化并查集 具体不说了 这里多维护一个深度就好了,其他没啥区别 然后居然没有数据范围?! 然后自己凑一下,大约10^7数组可以过 唉,毒瘤数据结原创 2017-04-05 21:35:08 · 519 阅读 · 0 评论 -
线段树——BZOJ1012/Luogu1198 [JSOI2008]最大数
http://www.lydsy.com/JudgeOnline/problem.php?id=1012 https://www.luogu.org/problem/show?pid=1198 经典老题现在才AC。。。 这题方法很多,有单调栈,有线段树,有树状数组…… 我是用线段树写的 其实就是胜者树求区间最大 我们建一棵大小为m的线段树,然后插入节点和询问都是模板了#include<b原创 2017-03-24 11:06:06 · 352 阅读 · 0 评论 -
胜者树(线段树RMQ)——Luogu1816 忠诚
胜者树是一种特殊的线段树 这个东西支持查询区间查询极值,修改某值 听老师说这个东西可以代替二叉堆。。。 和线段树写法一样的 我们以找区间最小值为例 建树:void build(int l,int r,int nod){ if(l==r)t[nod]=a[l];//叶节点 else{ int m=(l+r)/2;//中间点 build(l,m,原创 2017-03-17 15:15:40 · 350 阅读 · 0 评论 -
单调栈+树状数组——51nod1249 近似有序区间
题面:51nod1249 这题题解蛮少的(我没有看官方题解)而且貌似都是线段树,但是讨论里给出了一个很巧妙的做法 我们可以先求出第ii位数作为最大值最远能延伸到的左端点b[i]b[i],和作为最小值最远能延伸到的右端点c[i]c[i],这个用单调栈就可以了 然后我们可以发现对于任意一组i,j(i<j)i,j(i<j),如果b[j]<=ib[j]<=i而且c[i]>=jc[i]>=j,区间[i,原创 2017-09-22 21:55:40 · 544 阅读 · 0 评论 -
贪心+线段树(优先队列)——51nod1191 消灭兔子
题面:51nod1191 哈哈哈……脑回路清奇 首先我们可以很快想到贪心,我们把兔子的血量从大到小排序,箭按照伤害值从小到大排序,那么我们就可以先做血量多的兔子,这样就可以为血量少的兔子留出箭了 因为数据范围有5W,所以可以想到RMQ 其实只要一个堆就可以了,我清(zhi)奇(zhang)地想到了线段树。。。#include <cstdio>#include <algorithm>#in原创 2017-09-08 13:38:25 · 285 阅读 · 0 评论 -
浅谈主席树和区间第k值
主席树,是一种高级数据结构,是线段树的高级形式 主席树的全名应该叫做可持久化线段树 顾名思义,这种数据结构可以持久化,也即可查询历史记录 至于为什么要把这种数据结构叫做主席树,我就不多说了(我是不会告诉你我其实也不知道啊) 首先声明:本贴中的修改指单点修改我们先来说说主席树的来源吧。 一开始的关于记录历史记录(也就是可持久化)的做法是:建多个线段树分别存储,然后直接找对应的线段树即可 但原创 2017-04-05 14:46:48 · 998 阅读 · 0 评论 -
线段树——51nod1466 三角巧克力
题面:51nod1466 想了很久经过点拨之后才想到做法……(NOIP要爆零啦) 其实找到关键突破点就知道这题怎么做了。。。 这题的关键突破点就是保证起点在反对角线上 我们把行和列分开来,记录该行(列)目前还剩下多少巧克力 每次对一行进行操作时,我们去找到列上在这一列前面的离这一列最近的剩下的巧克力少于这一列的位置(对列进行操作同理) 听起来很拗口是不是? 就拿样例解释吧 比如我原创 2017-11-08 23:04:26 · 246 阅读 · 0 评论 -
倍增+树状数组——BZOJ4551 [Tjoi2016&Heoi2016]树
题面:BZOJ4551 这题在线最优复杂度O(nlogn)O(nlogn),离线则是O(nα)O(nα),具体做法网上都有 然而我有一个神奇的O(nlog2n)O(nlog^2n)的想法 其实和在线线段树差不多 如果有一个点被标记,我们把这棵子树的权值全部+1 然后查询的时候向上找到最上面的权值和这个点相同的点 倍增一下就好了 我大概是石乐至了QAQ#include <cstdio>原创 2017-12-15 15:49:43 · 493 阅读 · 0 评论 -
树链剖分——BZOJ3631/Luogu3258 [JLOI2014]松鼠的新家
题面:BZOJ3631 Luogu3258 简要题面:每次修改树上一条链的值(+1),最后询问每个点的值 裸的树剖,内套区间修改线段树 我本来还以为这题码量可以稍微少一点(因为一开始线段树上都为0),可惜的是我其他还记录着东西 所以代码还是光荣地快上百行了 最后输出时候要注意一点,因为每个中转点(就是链的端点)都被多算了一次(第一个和最后一个除外),因为中转点各属于两条不同的链 再加上最原创 2017-05-18 21:06:41 · 333 阅读 · 0 评论 -
树链剖分——BZOJ1036/Luogu2590 [ZJOI2008]树的统计
题面:BZOJ1036 Luogu2590 树剖裸题,比luogu某模板题不知道水到哪里去了。。。 今天刚入门,看到一篇很好的树剖入门教程,写得很不错:传送门 对于初学者来说讲得很详细 最后来说说这道题 单点修改直接暴力找进线段树修改 求链上最大以及求和同链上修改,只不过不必更新权值 打得谨慎一点就行了 献上我的丑陋程序+注释#include<cstdio>#include<cst原创 2017-05-17 11:10:20 · 336 阅读 · 0 评论 -
树链剖分——BZOJ4196/Luogu2146 [Noi2015]软件包管理器
题面:BZOJ4196 Luogu2146 首先软件包形成了一棵树,然后题中的软件包只有两种状态:装了与没被装 如果要装某个软件包,那么从这个包到根的软件包都要装 如果要卸某个软件包,那么以这个软件包为根的子树软件包都不能装 所以这道题实际要我们干什么:树上修改一条链的值,修改子树的值,求一条链的和,求子树和 然后发现要求的操作和洛谷的树剖模板题几乎一样?! 那么就把Luogu的模板原创 2017-05-17 20:27:58 · 450 阅读 · 0 评论 -
莫队——BZOJ3289 Mato的文件管理
http://www.lydsy.com/JudgeOnline/problem.php?id=3289 是离线的好开心啊 为什么说开心呢,这种题,碰到离线,就可以莫队了呀 求逆序对嘛,来发树状数组 首先我们可以求出1~i-1区间内比i大的数,然后前缀和搞搞就是啦 接下来交给分块莫队 ps:一开始T了n发找不到问题后来才发现是块搞错了。。。#include<bits/stdc++.h>原创 2017-04-07 18:49:25 · 304 阅读 · 0 评论 -
树套树——BZOJ3196/Luogu3380 二逼平衡树
http://www.lydsy.com/JudgeOnline/problem.php?id=3196 https://www.luogu.org/problem/show?pid=3380 tyvj原题:传送门 这么多乱七八糟的操作,交给平衡树好了 再加上区间,外面套个线段树好了 不过呢,可能我写得太渣了吧,splay一直TLE 没办法,换了个非旋式Treap搞搞掉算了。。。#inc原创 2017-04-10 10:29:03 · 361 阅读 · 0 评论 -
线段树/莫队——BZOJ1878/Luogu1972 [SDOI2009]HH的项链
http://www.lydsy.com/JudgeOnline/problem.php?id=1878 https://www.luogu.org/problem/show?pid=1972 隔了一段时间用新方法重做此题。。。 这个可以看做离线区间查询问题,一段时间以前,我把这题当做是线段树来做 具体思路:把询问按照右端点从小到大排序,然后一个一个插入 意思是说按照项链的真实情况插入原创 2017-04-11 08:19:35 · 407 阅读 · 0 评论 -
主席树维护dfs序——BZOJ3653/Luogu3899 谈笑风生
题面:BZOJ3653 Luogu3899 被luogu难度等级骗了。。。 首先看到子树的题就是dfs序了,我们用L[i]L[i]表示i的初访问戳,R[i]R[i]表示i的末访问戳 我们设size[i]size[i]表示子树大小(不包括i),deep[i]deep[i]表示深度 首先我们可以发现a,b,c在一条链上,所以我们考虑这几种情况:b是a的祖先,根据乘法原理我们可以得到答案是siz原创 2017-08-18 11:09:12 · 324 阅读 · 0 评论 -
整体二分——BZOJ2527/Luogu3527 [POI2011]MET-Meteors
题面:洛谷3527 BZOJ2527 这题首先可以想到二分答案但是呢有很多点需要二分 同时每个点的二分状态都差不多 那么我们就一起二分(整体二分) 每次二分出答案以后对于每个国家计算有几颗流星 这个树状数组和线段树都可以维护(我用树状数组调了一个上午QAQ) 然后超过希望总数的点放到左边去,没有的放到右边去 然后分别继续二分 对然后统计答案即可#include<bits/stdc++.h>usi原创 2017-05-02 11:30:50 · 491 阅读 · 0 评论 -
线段树——Luogu3870/BZOJ1230 [Usaco2008 Nov]lites 开关灯
题面:Luogu3870 BZOJ1230 首先让我扯淡一会。。。 新高一开学的恐惧。。。 20号开学之后因为一直没有请到晚自修请假来机房的机会一直在教室。。。 还有军训QAQ。。。 今天我总算回到机房啦!!! 回到机房的第一件事当然是先刷道水题啦回到正题。首先你会发现luogu是TJOI的题。。。其实原题就是usaco月赛题 其实非常简单,其实就是区间翻转操作 所以我们维护一个翻转原创 2017-08-25 19:32:59 · 262 阅读 · 0 评论 -
概率+树套树——UOJ#291/Luogu3688 [ZJOI2017]树状数组
题面:Luogu3688 UOJ#291 我考场上这题打都没打QAQ,出来说这题是Day1最水的一道。。。 题目的大意嘛。。。就是这张图啦(Ps:orz SW_Wind) (注意到可怜手上拿着的倒着的“树状数组”了吗接下来开始了无限的懵逼。。。 过了N多个月,看了N多个题解之后,我终于懵逼地在luogu上卡着AC了 然而UOJ还是被卡常90分QAQ 首先要知道的是可怜写的sb“树状数原创 2017-07-08 15:45:17 · 356 阅读 · 0 评论 -
线段树——Luogu1471 方差
题面:Luogu1471 一眼数据结构题 然后我们要维护区间方差?带区间修改? 听起来是不是很麻烦? 首先题目给的方差公式: 这个是平均数 我们可以化开来看: 然后因为中间一项的a[1]+a[2]+…+a[n]=*n 是不是? 所以继续化: 然后我们只要用线段树维护一下区间和还有平方和就可以了 但是区间修改怎么下传平方和呢? 我们把要加上的数记为v,那么:原创 2017-06-15 09:16:50 · 594 阅读 · 0 评论 -
后缀数组(入门)——51nod1732 51nod婚姻介绍所
题面:51nod1732 要死的SA! 今天入门后缀数组,具体的后缀数组教程网上也很多 这里推荐一个:传送门,讲的还不错 听说这题可以用hash直接过,不过的确是SA的入门题哦 这题要我们求的是串s对于x,y的最大公共前缀 掌握SA的基本操作之后这题的答案就是min(Height[rank[x]]~Height[rank[y]]) 然后可以用线段树维护一下,否则T了QAQ#includ原创 2017-06-08 16:59:23 · 440 阅读 · 0 评论 -
主席树——Codeforces811B Vladik and Complicated Book
题面:cf811b 简要题意:给定一个1~n的排列, 询问区间l,r经过排序后数列第k个数是否还处在原位(l<=k<=r)和求区间k小很像,转化一下题目就是询问区间l,r中数列第k个数是否为区间第(k-l+1)小 所以权值主席树直接上不虚。。。 据说暴力能过。。。QAQ(毕竟是B题,数据范围这么小+毛子机子跑得快肯定能过)#include<cstdio>#include<algorith原创 2017-06-01 15:44:22 · 414 阅读 · 0 评论 -
CDQ分治——BZOJ3295/Luogu3157 [CQOI2011]动态逆序对
BZOJ传送门 Luogu传送门 以前一直想用树套树过掉此题,太懒不想写。。。(我不会告诉你我其实是不会树套树做法因为实在太恶心了。。。) 然后呢,现在掌握了新技能以后发现这题就可以很快地过去了 我们可以把删除操作看成倒着加入操作,然后。。。 这题就变成了时间为t时的逆序对数目,我们可以看成一个三维的比较,即a[i].t<=a[j].t,a[i].x < a[j].x,a[i].v >原创 2017-04-24 11:33:25 · 239 阅读 · 0 评论 -
CDQ分治——BZOJ4553 [Tjoi2016&Heoi2016]序列
传送门 和带三维的关键字最长不降挺像 所以我们可以先搞出所有数的原值,最小值和最大值 然后可以CDQ求解 我们首先l~mid按照最大值排序,mid+1~r按照原值排序(每个排列最多只能改动一个数) 然后计算前面的对后面答案的影响即可 跟LIS差不多,只不过最后一维我们用一个树状数组来维护 最后清空一下(和二维矩阵差不多) 对就是这样,答案记录一下最大值就好了 然后关于树状数组和排序原创 2017-04-23 20:37:23 · 496 阅读 · 0 评论 -
CDQ分治——BZOJ1176 [Balkan2007]Mokia
传送门 纪念我第一个CDQ分治代码(当然调了很久)还有这个很像某手机品牌的题目名称 二位数点但是差值太大树套树MLE+TLE 但是离线很重要,这个时候CDQ分治派上用场了(%%%陈丹琦dalao发明了这个东西) 我们先把所有操作按照x坐标先y坐标后排序(双关键字保平安) 然后区间l,r取mid,计算l~mid的修改对mid+1~r的查询的影响 我的做法是先把编号小于等于mid的换到左边去原创 2017-04-21 15:22:12 · 363 阅读 · 0 评论 -
树状数组——BZOJ3192/Luogu3253 [JLOI2013]删除物品
干脆题面以后用HTML写传送门吧 BZOJ传送门 洛谷传送门 我们可以试一下把两个堆(其实这是个栈)拼起来(栈顶拼栈顶)比如样例拼成:5 4 1 2 7 3 然后把栈顶视为一个指针,每次出栈只要移动指针即可 然后区间弹栈信息我们用树状数组维护一下,移动次数就可以算出来了#include<bits/stdc++.h>using namespace std;typedef long lon原创 2017-04-19 14:48:12 · 358 阅读 · 0 评论 -
树状数组——BZOJ4240 有趣的家庭菜园
http://www.lydsy.com/JudgeOnline/problem.php?id=4240 我们的4.12模拟赛T1 和找逆序对差不多。。。 把序列变成合唱队形差不多就行了 一开始的想法是直接左边逆序对数和右边正序对数合并找最小 这样只有10分QAQ。。。 正确的思路是直接找数i在前面的逆序对数和后面的正序对数取小累加 用树状数组维护一下,时间复杂度O(nlogn)#in原创 2017-04-13 19:53:47 · 286 阅读 · 0 评论 -
树链剖分——BZOJ2243/Luogu2486 [SDOI2011]染色
题面:BZOJ2243 Luogu2486 线段树维护树上DFS序带修改求区间连续段数目 上面这么长一串可以简单缩成:树剖维护区间连续段也可以说成线段树上树(雾 首先外面的那层树剖应该很好套,内层区间线段树搞一搞就好了 线段树维护区间连续段嘛。。。应该来说还是比较好搞吧(虽然搞了我一个下午QAQ) 每个线段树上节点维护t(区间段数),lc(左端颜色),rc(右端颜色) 然后合并时从下传上原创 2017-05-17 21:11:15 · 300 阅读 · 0 评论