随笔分类 -  数据结构——线段树

摘要:题意: $n$个草,第$0$天种下,高度都为$0$,每个草每天长高$a_i$。现给出$q$询问,每次给出第$b_i$天,然后把高于$d_i$的全削成$d_i$,每次问你此次削下来的高度是多少,$b_{i 1} include include include include include inclu 阅读全文
posted @ 2019-10-02 22:19 KirinSB 阅读(147) 评论(0) 推荐(0)
摘要:题意: 已知$n$个数字,进行以下操作: $1.$区间$[L,R]$ 赋值为$x$ $2.$区间$[L,R]$ 赋值为$max(a[i] + x, 0)$ $3.$区间$[L,R]$ 询问$0$个数 已知初始值$\geq 0$,$x\geq0$。 思路: 吉司机线段树。 操作$1$可以直接打覆盖标记 阅读全文
posted @ 2019-09-13 00:31 KirinSB 阅读(178) 评论(0) 推荐(0)
摘要:题意: 已知$n$个数字,进行以下操作: $1.$区间$[L,R]$ 按位与$x$ $2.$区间$[L,R]$ 按位或$x$ $3.$区间$[L,R]$ 询问最大值 思路: 吉司机线段树。 我们按位考虑,维护区间或$\_or$和区间与$\_and$,那么得到区间非公有的$1$为$(\_or \opl 阅读全文
posted @ 2019-09-12 17:03 KirinSB 阅读(399) 评论(0) 推荐(0)
摘要:题意: 已知$n$个数字,进行以下操作: $1.$给一个区间$[L,R]$ 加上一个数$x$ $2.$把一个区间$[L,R]$ 里小于$x$ 的数变成$x$ $3.$把一个区间$[L,R]$ 里大于$x$ 的数变成$x$ $4.$求区间$[L,R]$的和 $5.$求区间$[L,R]$的最大值 $6. 阅读全文
posted @ 2019-09-11 14:17 KirinSB 阅读(361) 评论(0) 推荐(0)
摘要:题意: 给出区间与、或、异或$x$操作,还有询问区间和。 思路: 因为数比较小,我们给每一位建线段树,这样每次只要更新对应位的答案。 与$0$和或$1$相当于重置区间,异或$1$相当于翻转区间,那么设出两个$lazy$搞一下。注意父区间$pushdown$重置标记时,子区间的翻转标记要清空。 代码: 阅读全文
posted @ 2019-09-08 23:43 KirinSB 阅读(188) 评论(0) 推荐(0)
摘要:题意: 操作有:$1$.区间都加$a$;$2$.区间都乘$a$;$3$.区间都重置成$a$;$4$.询问区间幂次和$\sum_{i=l}^rnum[i]^p(p\in\{1,2,3\})$ 思路: 设一个数为$m sum+a$,加就变成了$m sum+a+a_2$,乘就变成了$m m_2 sum+a 阅读全文
posted @ 2019-08-25 19:36 KirinSB 阅读(232) 评论(0) 推荐(1)
摘要:题意: 操作有:区间加,区间乘,区间询问求和 思路: 设一个数为$m sum+a$,加就变成了$m sum+a+a_2$,乘就变成了$m m_2 sum+a m_2$,所以我们设两个标记$mul$表示乘,$add$表示加,然后如上转化。 代码: cpp include include include 阅读全文
posted @ 2019-08-25 16:22 KirinSB 阅读(205) 评论(0) 推荐(0)
摘要:题意: "传送门" 有$n$个点构成一个无向图,每条边有$L_i,R_i$表示这条边只能允许编号为$L_i\dots R_i$的人通过,现在问你最多有几个人能从$1$走到$n$。 思路: 我们可以枚举每个编号,然后看看能通过这个编号的所有边能否构成一个图使得$1$走到$n$,但是显然枚举点很不现实, 阅读全文
posted @ 2019-08-21 20:22 KirinSB 阅读(290) 评论(0) 推荐(0)
摘要:题意: "传送门" 有一个空的队列,有$n( n include include include include include include include include include include include include include typedef long long ll; 阅读全文
posted @ 2019-08-09 15:33 KirinSB 阅读(261) 评论(0) 推荐(0)
摘要:题意: 给一些坐标,问用一个任意大小矩形去框这些点,能获得的最大权值。$n include include include include include include include include include include include include include typedef 阅读全文
posted @ 2019-08-08 10:20 KirinSB 阅读(180) 评论(0) 推荐(0)
摘要:题意: n m的矩阵,为0表示可以走,1不可以走。规定每走一步只能向下、向左、向右走。现给定两种操作: 一.1 x y表示翻转坐标(x,y)的0、1。 二.2 x y表示从(1,x)走到(n,y)有几种走法 思路: 假设$dp[i][j]$表示从下一层能到达(i,j)点的路径数,那么显然到达(i,j 阅读全文
posted @ 2019-07-23 16:21 KirinSB 阅读(379) 评论(0) 推荐(0)
摘要:题意:给n个可能相交的矩形,问你不重复的总面积 思路:扫描线,一边扫一边加。 扫描线:图片来源:理解扫描线 假设我们要算以下四个矩形面积,显然中间深色的是重复的。我们按照x的大小,从左往右扫,然后用线段树维护y轴向的长度就可以了。但是,我们不能用点去维护y轴坐标,而是抽象成把点i看成y[i]到y[i 阅读全文
posted @ 2019-04-20 10:02 KirinSB 阅读(206) 评论(0) 推荐(0)
摘要:Problem Description 好久没出数据结构题,现在赶紧来做道数据结构题热热身 小q现在要去银行,他有个很厉害的bug能看到前面排队的人。假如当前有人正在办理业务,那么肯定要等待前一个人完成。现在有m个事件,分为3种。第一种是第x时刻有客人到银行办理业务,用时t。第二种是第i个事件中的客 阅读全文
posted @ 2019-04-10 13:46 KirinSB 阅读(166) 评论(0) 推荐(0)
摘要:题意:求最大上升子序列 思路:才发现自己不会LIS,用线段树写的,也没说数据范围就写了个离散化,每次查找以1~a[i]-1结尾的最大序列答案,然后更新,这样遍历一遍就行了。最近代码总是写残啊... 刚看了LIS的nlogn写法(贪心+二分):维护一个dp[i]表示最大长度为i时的最小结尾,初始mem 阅读全文
posted @ 2018-12-04 14:06 KirinSB 阅读(237) 评论(0) 推荐(0)
摘要:题意(FJUT翻译HDU): 钱陶陶家门前有一棵苹果树。 秋天来了,树上的n个苹果成熟了,淘淘会去采摘这些苹果。 到园子里摘苹果时,淘淘将这些苹果从第一个苹果扫到最后一个。 如果当前的苹果是第一个苹果,或者它严格高于之前选择的苹果,那么淘淘将采摘这个苹果; 否则,他不会选择。 题目来了:已知这些苹果 阅读全文
posted @ 2018-11-20 12:35 KirinSB 阅读(201) 评论(0) 推荐(0)
摘要:题意: 给定n个数a1,a2,a3,……an。和m次操作。 每次操作格式如下 x y k 表示将a[x]替换为y。并求替换后,前k小的数之和 思路:我们用带权线段树维护权值,这里就是维护i的个数num[i],然后顺便维护一下和。每次查询前k个数求和。 练习赛题解: 代码: 阅读全文
posted @ 2018-11-10 00:04 KirinSB 阅读(436) 评论(0) 推荐(0)
摘要:题意:有一个环,有1~N编号,m次操作,将a位置的值改为b,问你这个环当前最小连续和多少(不能全取也不能不取) 思路:用线段树维护一个区间最值连续和。我们设出两个变量Lmin,Rmin,Mmin表示区间左边最小连续和,右边最小连续和,区间最小连续和,显然这可以通过这个方式更新维护。 现在我们已经可以 阅读全文
posted @ 2018-10-31 21:46 KirinSB 阅读(170) 评论(0) 推荐(0)
摘要:思路:若用dp[i][j]表示走到(i,j)的最大值,那么dp[i][j] = max(dp[i - 1][j],dp[i][j - 1],dp[i - 1][j - 1] + v),显然O(n^2)超时。但是我们可以优化这个dp,我们用f[j]表示第i行第j列当前最大值,那么f[j] = max( 阅读全文
posted @ 2018-08-27 10:28 KirinSB 阅读(184) 评论(0) 推荐(0)
摘要:题意:a数组初始全为0,b数组题目给你,有两种操作: 思路:dls的思路很妙啊,我们可以将a初始化为b,加一操作改为减一,然后我们维护一个最小值,一旦最小值为0,说明至少有一个ai > bi,那么找出所有为0的给他的最终结果加上一并且重置为bi,维护一个区间和,询问时线段树求和。一开始updateM 阅读全文
posted @ 2018-07-26 10:24 KirinSB 阅读(124) 评论(0) 推荐(0)
摘要:题意:一堆小朋友围成一个圈,规定从k开始玩,每个被选中的人都有一个数字,正数代表从他左边开始数num,负数从右边数,被选中的人继续按照上述操作,直到都退出圈子,第i个退圈的人能拿到一个点数,这个点数是i的因数个数(比如第4个人拿3点)。问:谁点数最多,一样多选第一个。 思路:一道好题啊,万万没想到是 阅读全文
posted @ 2018-07-22 20:59 KirinSB 阅读(91) 评论(0) 推荐(0)