
ACM_线段树
文章平均质量分 83
逍遥丶綦
这个作者很懒,什么都没留下…
展开
-
康托展开+线段树 Codeforces501D Misha and Permutations Summation
传送门:点击打开链接题意:求两个排列的次序相加取模n!后,得到新的次序,然后输出这个次序对应的排列思路:康托展开+逆展开+高精度。康托展开其实是个求逆序对的过程,逆展开实际上是一个找第k大的过程,都可以使用线段树来完成因为数字非常大,所以肯定是要用高精度的,但是这里的高精度很特别,不是使用十进制的高精度,而是使用阶乘进制的高精度,这样就可以和康托展开和逆展开完美的结合起来了。#in原创 2016-01-16 19:24:34 · 923 阅读 · 0 评论 -
线段树 hdu3874 Necklace
这题有两种方法,,一种是莫队算法,,感觉莫队算法是一眼就能看出来可以用的,,只是写起来也略有麻烦另外一种就是线段树,话说这题线段树写起来超级爽不知道为何首先询问需要离线,然后按照右区间从大到小排序pre[i]表示上一个数字i出现的位置然后从1开始枚举i到n,每一次在区间[pre[A[i]]+1,i]上利用线段树成段更新加上A[i]因为pre[A[i]]是上一个数字出现的原创 2015-08-09 21:32:12 · 968 阅读 · 0 评论 -
线段树 csu1555 Inversion Sequence
题意:告诉你逆序对,还原逆序对思路:首先我们来手动模拟一下样例51 2 0 1 01的前面有1个比1大的,2的前面有2个比2大的,4的前面有一个比4大的首先,1的位置可以直接确定,因为除了1以外所有的数都比1大,所以1肯定在第二个位置得到 _ 1 _ _ _然后考虑2,2的前面有两个数字比2大,因为我们已经确定的数字只有1,1已经比2小了,所以要无视1,其原创 2015-08-09 20:53:41 · 1080 阅读 · 0 评论 -
线段树 poj3667 Hotel
一道超级经典的区间合并的问题,凡是区间合并,难点都在于push_up和push_down有个地方我开始就弄混了,col其实应该有3种状态,1表示整个区间全部是空,0表示整个区间全部被用完了,-1表示不考虑然后只要弄清楚合并的顺序,就很好写了#include#include#include#include#include#include#include#include#i原创 2015-08-09 20:40:17 · 789 阅读 · 0 评论 -
线段树 poj3321 Apple Tree
真没想到,,原来树型结构只要稍微处理一下,竟然可以变成赤裸裸的线性结构,然后用线段树去处理!对于这道题,一开始很难想清楚,如何将树型结构转换线段树的前提是连续的区间,那能不能将树型结构变成线性结构呢?我们从根节点按照前序遍历给节点依次编号,对于每个节点,当访问完子树之后,将子树的最大节点也保存,那么这样就能得到一个区间段,见下图:然后会惊奇的发现,,当我们要原创 2015-08-09 20:36:35 · 992 阅读 · 0 评论 -
线段树 csu1542 Flipping Parentheses
题意:先给出一个符合括号匹配的字符串,然后Q次操作每次操作将某个括号反转,问将哪个括号反转能使字符串的括号再次匹配,位置要越靠近左端越好假如(表示数字1,)表示数字-1,A[i]表示前i个括号代表的数字之和((()))代表的数组A就是1 2 3 2 1 0那么这些数字会有什么用呢,,我们可以来找下规律如果是将(变成),如上面那个字符串的第2个反转,就会得到()())),原创 2015-08-08 13:16:46 · 1536 阅读 · 3 评论 -
线段树 bzoj4373 算术天才⑨与等差数列
传送门:点击打开链接题意:强制在线,单点更新,区间询问,询问这个区间的数从小到大排序后,是否能构成等差为k的等差数列思路:利用线段树维护数字之和,维护平方和,因为平方和很大所以还要取模,还要维护区间内的最小值然后每次查询先取出最小值,然后通过等差k求出区间内数字和以及平方和应该等于多少,然后再用线段树查询,看是否等于这么多。#include#include#include#i原创 2016-01-03 22:30:58 · 1511 阅读 · 0 评论 -
线段树 hdu2871 Memory Control
传送门:点击打开链接题意:区间内4种操作,1种分配连续长度的区间,2获取某个位置是被谁覆盖的,3获取第几个被覆盖的区间的左端点和右端点,4清空全部。思路:几乎涵盖了线段树的所有操作,有种恶心的感觉,,要维护的东西1.sum,lsum,rsum最大连续个数2.cnt个数,放在左端点3.col懒惰标记,默认-1,为0表示要清空,为其他数字表示这一段被占领#include#原创 2016-01-07 14:32:35 · 783 阅读 · 0 评论 -
线段树+二分 hdu5649 DZY Loves Sorting
传送门:点击打开链接题意:一个n的排列,然后执行Q次操作,每次操作是对某个区间从小到大排序或者是从大到小排序。最后只查询一次,输出第k个位置当前的数。思路:这道题最特别的地方,就是,只查询了1次,因为这个特点也让这道题有了不同寻常的解法。我们可以直接二分第k个位置的数的大小记为m,然后给初始序列处理一下,把小于等于m的记为0,大于m的记为1之后的排序操作就非常简单了,只需要区间修改原创 2016-03-23 16:27:27 · 1783 阅读 · 0 评论 -
bitset+DFS序+线段树 Codeforces633G Yash And Trees
传送门:点击打开链接题意:给你一棵树,根节点为1有2种操作,第一种是给u节点所在的子树的所有节点的权值+x第二种是询问,假设v是子树u中的节点,有多少种质数满足av = p + m·k其中p思路:首先用DFS序,把树弄成线段树来表示,这种做法十分常见就不多讲了因为m每次对子树增加权值的时候,只需要修改懒惰标记,来记录增加的大小然后直接把bitset利用位运算来完原创 2016-02-28 13:43:52 · 1149 阅读 · 0 评论 -
线段树+离线 hdu5654 xiaoxin and his watermelon candy
传送门:点击打开链接题意:一个三元组如果满足j=i+1,k=j+1,ai思路:刚开始看错题目了,原来三元组是连续3个,这作为bc最后一题也太水了把。。。先一遍预处理,把连续3个满足条件的找出来,放到另一个数组里排序去重,用这个数组来给三元组哈希,再扫一遍给三元组在之前那个排序好的数组里二分一下得到下标,大概就是哈希一下,用一个数字来表示。之后的查询,其实就是,在区间内,不同的数字有原创 2016-03-27 21:28:16 · 724 阅读 · 0 评论 -
离散化+线段树 codefores555C Case of Chocolate
传送门:点击打开链接题意:阶梯形的巧克力,每次选择边缘的一个格子,然后向上吃或者向左吃,直到边界或者空白位置停止,吃过的位置之后就是空白。思路:n很大,先把q查询的那些位置离散化一下,注意x+1和y+1也需要离散化一下。之后y会限制后来的x,x会限制后来的y,搞两个分开的线段树分别维护x和y就行了还要弄个vis来判断某一行或某一列是否已经放过,就ok了总的来说只要想清楚了细节,原创 2016-04-18 19:48:21 · 450 阅读 · 0 评论 -
线段树 hdu5700 区间交
传送门:点击打开链接题意:有n个区间,求k个区间,使得这k个区间相交的区间内数字之和最大。数列的数字均>=0思路:通常这种题目我们都会先按照区间的右区间位置排序。之后的步骤如果想到了,就会变得原创 2016-05-23 10:45:51 · 1627 阅读 · 0 评论 -
线段树 csu1082 憧憬一下集训
最简单的扫描线思想。。如果把空调温度当作横坐标,音响声音大小当作纵坐标,那么题意可以转换成,给你许多个矩形,问一个点最多被覆盖多少次~那么按照纵坐标大小排序,从下向上扫描,用线段树维护点的覆盖次数有个地方要注意排序的时候,因为不仅要按照坐标大小排序,因为s,t可能会相等,那么矩形会退化成一条线。那么我们一般的面积并的时候,是考虑两根扫描线之间的距离,而这题不仅要原创 2015-08-10 21:23:07 · 933 阅读 · 0 评论 -
线段树 hdu3265 Posters
刚开始想着添加4条边,但是发现这种思维得到的答案不对~因为,如果中间没有洞,遇到下边界的时候就在区间(x1,x2)上加一,遇到下边界的时候就在区间(x1,x2)上减一但是区间的cnt都会>=0但是如果先减一,再加一,那么因为cnt会变成负数,,所以以前的push_up就没用了后来想了一下,,为什么不直接把这个有洞的矩形,分割成4个完整的矩形呢??!分割完后,将新的矩形所原创 2015-08-11 22:34:10 · 925 阅读 · 0 评论 -
线段树 hdu1828 Picture
最经典的一道周长并的题目。其实周长并并没有想象那么难。首先,肯定要确定,我们需要做两次扫描线。第一次是从下向上,第二次是从左向右,这样得到的才是四周的周长其次,,扫描的时候如何更新周长呢?每次增加线段后,把新得到的长度与之前的做比较,两者之差的绝对值就是这次增加线段后的长度所以每次都这样更新,最后得到的就是周长了。#include#include#include#原创 2015-08-11 22:38:29 · 1532 阅读 · 0 评论 -
二分+线段树 Codeforces609F Frogs and mosquitoes
传送门:点击打开链接题意: 有n青蛙和m蚊子(n,m蚊子两个参数,位置pj,权值bj只有当xi+ti>=pj时,第i只青蛙才能吃到第j只蚊子。如果第j只蚊子能被多只青蛙吃到,那么xi最小的青蛙会把这只蚊子吃了每次青蛙吃了某只蚊子以后,ti会增加蚊子的bj输出n只青蛙吃的蚊子数,以及最后时候的舌头长度ti蚊子会按照给出的时间顺序出现。思路:我们先来考虑原创 2016-01-02 17:01:15 · 1265 阅读 · 0 评论 -
线段树 Codeforces292E Copying Data
传送门:点击打开链接题意:给两个数组A和B,有两种操作,操作1,将A数组的一部分复制到B数组的某一部分上,操作2,输出B数组的p位置当前的数值。思路:利用线段树打懒惰标记成段更新裸题#include#include#include#include#include#include#include#include#include#include#include#inc原创 2015-12-23 00:54:15 · 761 阅读 · 0 评论 -
离线线段树 Codeforces522D Closest Equals
传送门:点击打开链接题意:n个点告诉你,m次查询,每次查询给l,r,求区间[l,r]里面两个相等的数字的最近的距离是多少。思路:一般这种没有修改的题,都可以用离线来搞,按照区间右端点排序。然后各个点的值比较大,把它离散一下。用pre[i]维护上一个节点的位置,然后在线段树中,一个节点维护的是以这个节点作为两个相等的数字的左边那个,最小距离是多少。每次移动右端点时,都更新一下A[pre[原创 2015-12-20 21:23:36 · 1329 阅读 · 0 评论 -
树链剖分+线段树 poj2763 Housewife Wind
传送门:点击打开链接题意:2种操作,一种路径上的值统一修改,一种是询问路径上数字连续区间个数。思路:树链剖分+线段树合并。这道题目主要就是难在用树链剖分上套线段树合并后,因为整条链被分成了很多条短的,把这些短的也要按照顺序合并。又因为其实是从左边和右边链的最底端向上执行的,所以应该把左右的分开,然后就是更接近根节点的点是区间的左区间,远离的点是右区间。主要的问题就在于路径上的合并,原创 2015-12-03 14:36:03 · 836 阅读 · 0 评论 -
树链剖分+线段树 hdu3966 Aragorn's Story
传送门:点击打开链接题意:路径更新,单点查询思路:线段树+树链剖分,这里其实不需要懒惰标记也是可以做的#include#include#include#include#include#include#include#include#include#include#include#include#include#include#define fuck(x) c原创 2015-12-02 23:55:16 · 899 阅读 · 0 评论 -
树链剖分+线段树 bzoj1036 树的统计Count
传送门:点击打开链接题意:节点更新,路径求最大值以及求和。思路:树链剖分,要注意单点更新和边更新的区别。然后就是在建线段树的时候,应该是用重新编号的新编号去建立的,刚开始一直没注意这个地方,然后调bug也调不出来,后来看了好久才看出来,以后还真要注意一下。#include#define fuck(x) cout<<"["<<x<<"]"#define FIN freopen("in原创 2015-12-02 19:53:39 · 794 阅读 · 0 评论 -
树链剖分+线段树 spoj375 Query on a tree
传送门:点击打开链接题意:边更新,路径查询边权最大值思路:第一道树链剖分题,其实树链剖分就相当于把树的边给分类了一样,分成了重边和轻边。然后,有一个性质,重链的条数和轻边的条数都不会超过log(n),所以总的复杂也只有log(n)也就是说,本身要维护一个路径上的某个东西,如果直接用线段树做,并不是很好做,树链剖分就相当于把重链和轻边分开求,因为重链在DFS序下编号是可以连在一起原创 2015-12-02 16:29:05 · 762 阅读 · 0 评论 -
字符串hash+线段树 Codeforces580E Kefa and Watch
传送门:点击打开链接题意:给你一个原串,只有0和9组成。现在有两种操作操作1,区间修改,把[L,R]的数字都改成d操作2,询问区间[L,R]中是否满足si = si + x for all i from 1 to |s| - x.思路:虽然本身会字符串hash,但是没想到还能这样玩。。hash的思路和普通的是一样的,每一位中间乘以某个数字。。如果担心最后的答案,可以对两个大原创 2015-10-17 19:55:28 · 1094 阅读 · 1 评论 -
线段树 csu1551 Longest Increasing Subsequence Again
传送门:点击打开链接题意:给你一些数,删除一个连续区间,使得连续区间上升区间最大。思路:先求出SL,SR,分别表示以i结尾的最大连续区间长度和以i开头的最大连续区间长度然后从左边向右边将SL插入到线段树中,并类似求逆序数的方法去查询小于A[i]的在线段树中最大的数,并加上R[i]wa点:在递归线段树的时候,区间长度不应该是[1,n]而应该是[1,Max(A[i])],或者直接写成原创 2015-10-06 11:45:31 · 874 阅读 · 0 评论 -
线段树 csu1555 Inversion Sequence
传送门:点击打开链接题意:告诉你每个数字的逆序数,求原序列思路:从1开始考虑,利用线段树记录空白位置的数量,然后利用线段树维护插入位置经行插入#include#include#include#include#include#include#include#include#include#include#include#include#include#inclu原创 2015-10-06 09:13:52 · 713 阅读 · 0 评论 -
线段树 hdu3255 Farming
做了这么多扫描线的题,,基本都是一个思路。改来改去,,无非就是维护的节点的内容以及push_up越写越复杂了而已首先将价格排序处理一下编号,变成编号越大的powerfol越大然后后面添加扫描线的时候将旧编号直接转换成新编号就行了对于这题S[rt][i]维护的是,rt节点对应的区间中品种为i的长度S[rt][i]维护的是,rt节点对应的区间的品种为i出现的次数原创 2015-08-12 14:14:02 · 1351 阅读 · 0 评论 -
线段树 hdu3642 Get The Treasury
不得不说,这是一题非常经典的体积并。。然而还是debug了2个多小时...首先思路:按z的大小排序。然后相当于扫描面一样,,从体积的最下方向上方扫描,遇到这个面就将对应的两条线加入到set中,或者从set中删除,然后再对set中的所有边,求一次面积并由于最后求出来的是至少有3个体积叠加的部分的体积。所以需要维护3个节点,然后push_up会稍微啰嗦一点...原创 2015-08-12 11:40:41 · 1216 阅读 · 0 评论 -
线段树 hdu1255 覆盖的面积
和之前做过的fzu的一道线段树维护的内容恰好相反这题求的是覆盖次数大于等于2的面积思路:维护两个值,一个是覆盖次数大于等于1的面积,一个是覆盖次数大于等于2的面积然后在push_up的时候仔细分析一下,想清楚更新顺序就做完了..#include#include#include#include#include#include#include#include#i原创 2015-08-11 22:41:23 · 1043 阅读 · 0 评论 -
线段树+矩阵快速幂 codeforces718C Sasha and Array
传送门:点击打开链接题意:操作1,区间[l,r]的数字+x操作2,求sigma f(i),l答案取模1e9+7首先斐波那契数列用矩阵快速幂求,谁都会的。这里有一个矩阵乘法的性质,A*B+A*C=A*(B+C)有了这个性质,这题就非常傻逼了。在求斐波那契数列中,是A*F,A是变换矩阵,F是列矩阵那么我们用线段树的懒惰标记维护A矩阵,然后用sum维护F矩阵之后在线段原创 2016-09-24 09:55:04 · 1776 阅读 · 0 评论