线段树&&BIT&&平方分割
文章平均质量分 82
WA是一笔财富
这个作者很懒,什么都没留下…
展开
-
HDU 4288 Coder 线段树||暴力
传送门:HDU4288题意:维护一个队列,三种操作:add x 将x加入队列(有序插入),del x 将x从队列删除, sum 输出队列中下标i%5==3的和。这题当时在暑假是用线段树写的。。当然是对着题解。。现在对线段树还是一窍不通。。这次又做发现好像暴力也能过,心想这次终于不用看题解了吧。。没想到啊。。暴力怎么改怎么TLE,对着题解还改了好几遍。。最终跟题解写法差不多了原创 2016-11-02 20:50:42 · 224 阅读 · 0 评论 -
POJ - 2155 Matrix 二维树状数组(区间更新,点查询)
传送门:POJ2155题意:给一个n*n的01矩阵,然后有两种操作:1.C x1 y1 x2 y2是把这个小矩形内所有数字取反2.Q x y 是询问当前这个点的值是多少?思路:很容易想到要用树状数组或线段树。树状数组的话显然是不能暴力更新的,这时候就要用到一个类似于imos法的思想了,关于imos法:点击打开链接(只看图理解思想就好了,感觉里面的代码写的有问题)首先要注意的原创 2017-08-04 17:23:41 · 299 阅读 · 0 评论 -
HDU 6070 Dirt Ratio 线段树 + 二分
传送门:HDU6070题意:给出一段序列,找出其中一段子序列,使得子序列中不同元素个数除以子序列元素总数最大。思路:先贴上官方题解:二分答案midmid,检验是否存在一个区间满足\frac{size(l,r)}{r-l+1}\leq midr−l+1size(l,r)≤mid,也就是size(l,r)+mid\times l\leq mid\times (原创 2017-08-04 19:59:20 · 227 阅读 · 0 评论 -
HDU 6133 Army Formations 树状数组 + 启发式合并
传送门:HDU6133题意:给你一棵n个节点的二叉树,每个节点要提交一个任务,需要花费一定的时间,每个节点都要提交这个节点和其子树所有的任务,从0时刻开始提交任务,每个任务提交时的罚时定义为该任务提交的时刻 + 该任务提交所需的时间。求每个节点提交完所有任务的最小罚时。思路:首先结合样例我们可以将题意转化为: 对于每个节点,将其子树上所有点按权值从小到大排序,则所求结果为∑val[i] *原创 2017-08-21 21:52:38 · 566 阅读 · 0 评论 -
HDU 6155 Subsequence Count dp + 矩阵+ 线段树
传送门:HDU6155 题意:给出一个长度为n的01串和两种操作: 1.将区间[L, R]翻转(0变1,1变0) 2.计算区间[L, R]的不同的子序列的个数 思路:一开始以为算子串数量,对着题解怼了半天没看懂。。 叉姐的题解: 来自:ICPCCamp 里面帖子的回复中有对转移方程为什么不会重复计数的解释。然后就是如何用线段树去维护:详细讲解 但是我看了很多的博客都没有讲解为什么原创 2017-08-23 20:06:46 · 271 阅读 · 0 评论 -
Codeforces 842 D Vitya and Strange Lesson 线段树
传送门:Codeforces 842D题意:给出一个长度为n的序列和m次操作,每次操作将序列中所有数异或上给定的数x,然后求序列的mex。mex:给定序列中未出现的最小的非负数。思路:首先不要被题目中说的每次序列都会变化迷惑,因为异或满足结合律,因此我们只要把所有的x异或起来,就相当于对原序列和一个x求题目中的要求,假设原序列为a[i],和x异或以后得到b[i],我们要求mex(b[i原创 2017-08-30 18:03:33 · 364 阅读 · 0 评论 -
HDU 6194 string string string 后缀数组 + RMQ(线段树)
传送门:HDU6194题意:问给定字符串中有多少种出现k次的子串。思路:首先想到后缀数组经典问题,求出现不少于k次的子串的最大长度,类似的这题肯定就是在height数组上搞事情啦。将height数组每相邻k - 1个一组,这k - 1个height[i]中最小的那个设为tmp,就表示这排名相邻的k个后缀的最长公共前缀(设为s)长度为tmp,可以得出s出现了至少k次,那么长度为tmp -原创 2017-09-10 20:34:18 · 499 阅读 · 0 评论 -
HDU 5875 Function 线段树 || (ST表 + 二分)
传送门:HDU5875题意:给定长度为n的一个序列和m次询问,每次询问给出l,r,求a[l] % a[l + 1] % a[l + 2] ... %a[r]。思路:我们只单纯考虑有效取模的话,那么一个数x最多取模logx次,那么问题是怎么使得每次取模操作都有效,转化为找到一个区间内第一个比x小的数,线段树可以解决,要注意的是用线段树的话常数大,很容易T,可以加一个小优化:当要寻找的区间包含原创 2017-09-02 19:54:45 · 154 阅读 · 0 评论 -
HDU - 5869 Different GCD Subarray Query 树状数组离线处理
传送门:HDU5869题意:给出一个长度为n的序列和m次询问,每次询问给出l,r,求[l, r]区间内所有子序列不同gcd的个数。思路:首先明确对于一个序列a[l...r]的所有以a[l]开头的子序列,所能得到的不同gcd的个数最多有log(a[l])个。那么这个题中我们就可以对于每一个位置,预处理出以该位置为结尾的所有不同gcd的最大左边界(即L至少要到这个位置才能在L~R这个区间中能形原创 2017-09-02 23:45:42 · 325 阅读 · 0 评论 -
HDU 6203 ping ping ping LCA + dfs序 + 树状数组(区间更新单点查询)
传送门:HDU 6203题意:给出n+1 个点的树,其中有若干个点无法通过,导致 p 组顶点对(u, v)之间无法连通。问无法通行的点最少有多少个。思路:对p组(u,v)顶点对求LCA,并按LCA的深度排序,从深度最大的开始处理,然后在dfs序上进行标记,若当前顶点对之间已经不可达,则直接跳过,否则将其LCA在dfs序上标记出来。具体标记及判断方法详见:点击打开链接树状数组区间更新原创 2017-09-12 23:47:36 · 675 阅读 · 0 评论 -
Codeforces 869 E. The Untended Antiquity 二维树状数组
传送门:Codeforces 869E题意:在一个n×m的方格板上,操作1将一个矩形区域的边界上加上一圈障碍,操作2将一个矩形区域的边界上的障碍移除,操作3询问两点是否能不越过障碍互相到达。题目保证任意两圈矩形障碍不会相交。思路:很容易想到二维树状数组实现区间更新点查询,但是如果只是简单的+1,-1更新的话是无法判断出两点是否可以不经过障碍可达的。因此我们要把每一圈障碍都哈希出一个不同的值原创 2017-10-07 22:26:58 · 537 阅读 · 0 评论 -
2015-2016 Northwestern European Regional Contest (NWERC 2015) 补题
C.Cleaning Pipes题意:给出n条管道(线段),任意两个管道之间之多有一个交点,忽略一个管道头部和其他管道的交点,问能否选出一个不相交的管道集合来使得所有交点都被这些管道覆盖。思路:将管道抽象成点,两个管道的交点抽象成边,那么问题转化成判断新建的图是否是一个二分图。判断二分图最常用的方法就是染色法,本题当然也就可以用,然而我看dalao的代码还学了另一种方法:利用并查集判断原创 2017-10-08 23:12:37 · 381 阅读 · 0 评论 -
HDU - 4777 Rabbit Kingdom 预处理 + 树状数组(区间更新点查询)
传送门:HDU4777题意:给出一个长度为n的序列和m个询问,每次询问求[l, r]区间内和区间内其他数都互质的数有多少个。思路:对于每个位置的数先向左向右预处理出最长互质区间L[i], R[i],然后将所有询问记录下来按左端点排序,遍历每个位置pos,若该位置为某个L[i],则将树状数组 i 位置+1,R[i] 位置 - 1,若某个询问Ql == pos,则该询问就可以直接计算出答案了,原创 2017-09-27 14:12:29 · 258 阅读 · 0 评论 -
HDU - 5517 Triple 二维树状数组
题意:有二元组(a,b),三元组(c,d,e)。当b == e时它们能构成(a,c,d)。 然后,当不存在 [ (u,v,w)!=(a,b,c)且u>=a,v>=b,w>=c ]时,则是一个better集合里的元素。 问这个better集合有几个元素.思路:首先能确定的是每一个原来的三元组最多构造一个新的三元组,因为当b == e时,我们只能选所有(a, b)当中a最大的那个(选其原创 2017-10-02 20:58:44 · 199 阅读 · 0 评论 -
CodeForces - 540E Infinite Inversions 离散化 + 树状数组
题意:有一个1,2,3,4...无限序列,进行m次操作,每次交换i,j位置上的数,问操作完以后有多少对逆序数。思路:来自:点击打开链接思维点在于将没有操作过的连续序列也离散成一个点,权值为序列中数的个数,这样就可以无脑进行交换操作,然后用树状数组统计一下逆序对数就好了(注意每个点有权值)。代码:#include#define ll long long#define inf 0x原创 2017-10-02 21:15:34 · 255 阅读 · 0 评论 -
HDU 6183 Color it 线段树(动态分配节点)
传送门:HDU6183题意:有四种操作:0:把所有点清空1:在(x,y)上添加一个颜色为 c 的点(不会覆盖以前的颜色)2:查询横坐标1 到 x1,纵坐标 y1 到 y2 这块区域内颜色种数3:退出思路:因为只有51种颜色,建立51颗线段树,每颗线段树节点下标对应颜色c的y坐标值,节点的值为该y坐标下最早出现颜色c的x坐标,因为每次询问都是[1, x1], 易证这样维护是正原创 2017-10-05 20:21:01 · 315 阅读 · 0 评论 -
HDU - 5029 Relief grain 树链剖分 + 线段树好题
题意:给出一棵n个节点的树,和m次操作。 操作a,b,k相当于将树上a,b结点间的路径上的节点都加上一个type k,最后输出每个结点被加最多次的那个type, 若有多个type被加的次数相同,输出编号最小的type。思路:显然要先树链剖分将树上操作变成线性序列的操作,emmm,然后我就不会了。。正解:树链剖分后考虑如何维护更新操作,对于一个操作a,b,k,我们可以在pos[a]位置打上一原创 2017-10-11 22:50:04 · 284 阅读 · 0 评论 -
POJ - 2886 Who Gets the Most Candies? 树状数组 + 二分 + 反素数
传送门:POJ2886题意:n个小朋友在玩一种类似于约瑟夫环的游戏,定义F(p)表示p的约数个数,第p个出队的将会得到F(P)个糖,问哪个小朋友得到的糖最多。思路:首先明确我们一开始就能知道第几个出队的小朋友能得到最多的糖果,并且这还是一类特殊的数,叫反素数,定义:对于任何正整数,其约数个数记为,例如,如果某个正整数满足:对任意的正整 数,都有,那原创 2017-08-04 17:01:43 · 232 阅读 · 0 评论 -
Codeforces 834D The Bakery 线段树优化DP
传送门:Codeforces 834D题意:给定一个序列,将其分成k段,每段的值定义为其中不同数的个数,问怎么分能使总值最大。思路:dp[i][j]表示将前j个数分成i段能得到的最大值。显然dp[i][j] = max(dp[i - 1][k - 1] + num[k, j])(1暴力枚举的话是k * n^2的,显然不行,考虑优化取max的过程,可以用线段树维护,记录每个数和它前一个数原创 2017-08-01 01:58:47 · 317 阅读 · 0 评论 -
POJ - 1201 Intervals 差分约束 || 贪心 + 线段树
传送门:POJ 1201题意:给出n个三元组(ai, bi, ci),找出一组元素数目最少的整数集合,使得集合中包含在[ai, bi]之间的数不少于ci个。思路:设d[i]表示[0..i]区间内选中了几个整数,则题给条件可以转化为d[bi] - d[ai - 1] >= ci,并且由于d[i]是一个前缀和函数,还满足 0 代码:#include#include#include#原创 2017-08-07 20:04:56 · 271 阅读 · 0 评论 -
POJ3468 A Simple Problem with Integers 线段树成段更新
传送门:POJ3468题意:给定n个数和两种操作,Q i j 代表求Σnum[t](i思路:线段树基本操作,成段更新,区间询问。也可以用树状数组做,详见挑战程序设计第二版P179.代码:#include#include#include#include#include#include#include#include#include#include#de原创 2017-02-05 19:08:02 · 258 阅读 · 0 评论 -
HDU1698 Just a Hook 线段树成段替换
传送门:HDU1698题意:给定n和q个操作,每个操作为:i j k 令num[t]=k(i思路:数据量较大,暴力肯定不行。考虑用线段树进行区间替换,这里询问只有一次,且是询问总区间,所以可以直接输出一号节点的信息。代码:#include#include#include#include#include#include#include#include#include原创 2017-02-05 19:32:42 · 203 阅读 · 0 评论 -
HDU2795 Billboard 线段树
传送门:HDU2795题意:h*w的木板,放进一些1*L的物品,每次优先放到能容纳且最上边最左边的位子,求每个物品在第几行。思路:用线段树维护每一行的剩余长度,每次更新时优先询问左子树。代码中我将update和query合到一起了。代码:#include#include#include#include#include#include#include#include#原创 2017-02-05 20:50:50 · 217 阅读 · 0 评论 -
HDU1394 Minimum Inversion Number 线段树
传送门:HDU1394题意:给定1-n的一个排列,可以将前面任意多个数按顺序放到后面形成新的序列,问所有这些序列中逆序数最小值为多少。思路:只要求出第一个序列的逆序数来,其他序列的逆序数就可以递推出来,因此重点在于第一个序列的逆序数怎么求,因为数据范围较小,可以考虑用树状数组或者线段树维护1-n每个点,出现过就更新为1,否则为0,则每个数产生的逆序数(即每个元素对总逆序数的贡献)就可以在输原创 2017-02-05 21:18:06 · 199 阅读 · 0 评论 -
POJ 2828 Buy Tickets 线段树单点更新
传送门:POJ2828题意:n个人买票,每个人入队的时候有可能站在队尾也有可能插队,给出每个人入队时前面有几个人,问最终的序列是什么样的。思路:因为最后入队的人位置最先确定(给定的前边有多少人就留多少空位),所以可以考虑逆向遍历,然后用线段树维护每个区间内还剩多少空位。代码:#include#include#include#include#include#include原创 2017-02-05 21:41:38 · 284 阅读 · 0 评论 -
POJ 2528 Mayor's posters 线段树+离散化
传送门:POJ2528题意:在墙上贴海报,海报可以互相覆盖,问最后可以看见几张海报思路:这题数据范围很大,直接搞超时+超内存,需要离散化:离散化简单的来说就是只取我们需要的值来用,比如说区间[1000,2000],[1990,2012] 我们用不到[-∞,999][1001,1989][1991,1999][2001,2011][2013,+∞]这些值,所以我只需要1000,1990,原创 2017-02-05 22:01:48 · 181 阅读 · 0 评论 -
HDU4417 Super Mario 线段树离线操作
传送门:HDU4417题意:给定n个数,多次询问L到R区间内小于H的数有几个。思路:① 先把所有位置的高度都存下来,然后排序,注意保存下标; ② 把所有询问存下来,然后按照询问的高度进行排序,同注意保存下标; ③ 对于排序后的每次询问的处理:由于每个位置的高度都已经存了下来并且进行了排序,所以可以按照顺序将每个点的对应下标在线段树中更新为1,直到要插入的位置的高度大于这原创 2017-02-05 23:14:26 · 284 阅读 · 0 评论 -
HDU 5862 Counting Intersections 扫描线
传送门:HDU5862因为题目已经说明所有的线段都是平行于坐标轴的那么,线段无外乎两种:①平行于x轴;②平行于y轴那交点必定只有竖向与横向的线段才会产生另外,此题数据规模显然是不允许我们进行O(n^2)的暴力求解那我们可以将横向的线段与竖向线段分开处理对于横向的线段,我们只保留端点再按x从小到大排序,x相等的情况下,左原创 2017-02-05 23:36:10 · 364 阅读 · 0 评论 -
Codeforces 8VC Venture Cup 2017 - Elimination Round D.PolandBall and Polygon
传送门:PolandBall and Polygon题意:给定n条边的凸多边形,保证这种凸多边形任意三条对角线不会交于一点,然后从一顶点出发,每次走K步,然后将出发点与终点连接起来,输出此时多边形被分成的块数,重复此步骤n次。解法:个人感觉就是多画几个图找规律。。或者你的几何学的好能推出公式或规律来,我发现的规律就是每画一条对角线,增加的块数等于该对角线跨过的对角线条数+1,也等于走的K步原创 2017-01-16 16:57:55 · 485 阅读 · 0 评论 -
Lost Cows POJ - 2182 线段树||树状数组+二分
传送门:POJ 2182题意:给定一个序列每个数的逆序数(第一个逆序数个数默认为零,不给出),求原序列。思路:这题和POJ2828有些相似,如果用线段树做基本一样了,都是维护区间内还有几个空位。但这个题我是用树状数组+二分做的,这样做的核心思想:序列中第n个数的逆序数应该是其逆序数+1,第n个数确定后,以此类推能确定第n-1个数。。。一直到第一个数。详见代码:#include原创 2017-03-18 22:23:34 · 285 阅读 · 0 评论 -
Ambitious Experiment URAL - 2062 分桶法(平方分割)
传送门:URAL - 2062题意:给定n个数的初始值,和两种操作:1.询问第i个数是多少2.给定l,r,d,将i,2*i,3*i...位置上的数加d,l思路:采用平方分割算法,也叫块状数组,算法思想大致就是讲整个区间分成长度为sqrt(n)的块,然后每次更新如果包括完整的块就直接维护整个块,然后将剩余部分单点更新。具体讲解见挑程序设计第二版P183.就本题来说,对第i个数有贡原创 2017-03-24 11:35:21 · 255 阅读 · 0 评论 -
New Year Tree CodeForces - 620E dfs序+线段树+状压
传送门:CodeForces - 620E题意:给定一棵树,每个节点都有自己的颜色,有两种操作1. 给定v , c,将节点v及其子树都染成c颜色2. 给定v ,统计节点v及其子树上的节点一共有几种颜色。思路:很明显可以就看出来是线段树的操作,但是就是不知道怎么建树。。应该是按照dfs的顺序对所有节点进行重标号,这样每个节点的子树中节点的标号范围也就是连续的了,然后就能进行正原创 2017-05-24 19:44:09 · 231 阅读 · 0 评论 -
Nested Segments CodeForces 652D 树状数组+离散化
传送门:CodeForces 652D题意:给出n个区间,问每个区间包含多少区间。思路:同时维护两个端点不好维护,我们可以按其中一个端点排序然后维护另一个端点,用树状数组维护一下就好了。代码:#include#define ll long long#define pi acos(-1)#define MAXN 100010#define inf 0x3f3f3f3fusin原创 2017-05-30 21:07:34 · 324 阅读 · 0 评论 -
块状数组+归并树学习 poj2104+hdu2665
今天在大白(挑战程序设计)上重新看了一遍分块数组相关的内容,虽然以前看过了,也做过相关的题目,但是总感觉只知道思想,自己不敢实现,今天把上面的例题照着敲了敲,也算加深了印象吧。例题:POJ2104和HDU2665这两个是题都是求区间第K大,只不过HDU上数据强并且时间限制少了点。以前以为平方分割求这种题还挺快的,没想到啊。。在POJ 11000+ms勉强水过,在HDU无情T掉。不原创 2017-07-10 18:08:01 · 250 阅读 · 0 评论 -
Codeforces 831 E. Cards Sorting set+树状数组模拟
传送门:E. Cards Sorting题意:给你n张卡片,每张卡片上都有数字,每次从顶端抽一张,如果是当前剩余卡片中最小的,就把他扔掉,否则放到堆底,问抽多少次能把所有卡片都扔掉。正解:将卡片上的数字的对应初始位置用set记录下来,大小相同数字的位置放到一个set里,并且用树状数组维护每个位置的卡片是否还在,然后我们从最小的数字开始遍历,假设上一次停下的位置是last,当前最小数字是x,原创 2017-07-16 22:28:00 · 399 阅读 · 0 评论 -
UVA - 11990 "Dynamic'' Inversion 树状数组套BST || 分块
传送门:UVA - 11990题意:给出一个1到n的全排列A[i],并给出m个删除操作,问删除每一个数前序列中有几对逆序对。思路:我写的方法来自:点击打开链接很容易想到删除一个数以后,减少的逆序对来自在它前面比它大的数,和在它后面比它小的数,暴力找这两种数的话显然是不行的,找比一个数大(小)的数可以用BST(二叉搜索树)去维护,但是我们怎么维护这些数在位置上的先后关系呢,考虑使用树状数原创 2017-08-07 19:45:15 · 241 阅读 · 0 评论 -
HDU - 5493 Queue 线段树 || Treap
传送门:HDU5493题意:给出n个人的身高和每个人前面或者后面有多少人比他高(不知道是前面还是后面),问能否构造出一个合法的序列。思路1:将所有人按身高从小到大排序,然后一个个取出来插入线段树,插入线段树的时候要保证前面留出足够的空来给比他高的人,又因为要字典序最小,那么我们插入的位置就是要min(ki, n - i - ki - 1) + 1.代码:#include#defi原创 2017-10-14 20:56:58 · 226 阅读 · 0 评论