
线段树
线段树习题
lushanlushan0026
退役acmer,准研究生
展开
-
1398E Two Types of Spells 权值线段树
假设目前有x个火魔法 y个星魔法 显然 y个星魔法让y个权值最大的魔法翻倍就行但是 有一个情况就是 y个星魔法就是前y大的魔法 这时候 肯定有一个y魔法不能翻倍 根据贪心 我们要去掉最小的y魔法 假如最大的x魔法用权值线段树维护上述操作即可 #include<bits/stdc++.h>using namespace std;const int N = 2e5+100;typedef long long ll;struct node{ int op,d...原创 2020-08-15 20:27:06 · 197 阅读 · 0 评论 -
CF 678F Lena and Queries 线段树维护凸包+三分
题意:维护一个点集 向点集中进行插入删除和查询的操作 其中查询操作是 求 q*x+y的最大值设 z=q*x+y 得到y=-q*x+z 显然我们需要使得截距z最大 我们需要维护一个凸包 然后在通过三分在凸包上找到最大值不过显然我们不能每次询问都去求一个凸包 那样复杂度是无法接受的我们可以维护每个点出现的时间 然后把它挂在线段树上面 最后在遍历一遍线段树就行了 (类似于线段树分治的思想)#include<bits/stdc++.h>using na...原创 2020-07-31 20:41:05 · 273 阅读 · 0 评论 -
P3792 由乃与大母神原型和偶像崇拜 双hash+线段树
想要知道区间内的数是不是连续的一段 显然我们需要一个hash函数来确定 其实应该很好想 我们先找出这个区间内的最大值和最小值 如果是连续的一段的话 那么肯定是从最小值到最大值这样连续的一段 那么我们首先维护区间最大最小值 其次维护区间和 这算是一个hash 但这还远远不够 因为区间和相同的时候 还有很多情况 那我们再维护一个区间平方和 如果区间平方和和区间和都和对应得最小值和最大值算出来得相等得话 那么就是连续得一段 区间和公式 很简单区间平方和公式 要用立...原创 2020-07-19 11:39:05 · 272 阅读 · 0 评论 -
P1600 天天爱跑步 线段树合并+lca
天天爱跑步有点毒瘤的题目 我们观察一下性质 在路径 u,v 上 如果这个路径 对某个点j 有贡献j肯定得在路径 u,v上 也就是说 如果当前遍历的点在 lca(u,v)上方的话 那么 u,v路径是肯定没有贡献的 因此到达lca时我们要把贡献去掉在说怎么算贡献 设u为起始点 v为终止点如果u对于j有贡献 有 如果v对于j有贡献 则设u,v路径的时间为 t 有又 化简可得然后需要注意的几点:1.当我们遍历的点为lca(u...原创 2020-07-09 09:00:04 · 220 阅读 · 0 评论 -
HDU 6315 G Naive Operations 线段树
这题看题面就知道是线段树了,但是我们发现这个式子并不是很好维护,那么我们可以换一个思路,对于每个add操作,我们把B序列的对应区间-1,当B序列中某个位置上为0的时候,这个位置的答案就+1 并且把这个值又变回到Bi 这个很好理解 所以我们要维护区间的最小值来看-1后以后会不会有位置变成0 对于会变成0的位置我们需要单点更新 有些人可能觉得 如果有多个位置同时为1的话 复杂度会很高 其实...原创 2020-07-09 08:45:47 · 133 阅读 · 0 评论 -
P1712 [NOI2016]区间 尺取法 +线段树
我们需要枚举区间 看是否有一个点被覆盖m次 暴力的枚举肯定是不行的 那么可以采用尺取法首先根据长度对n个区间进行升序排序 假设当前枚举的为 标号L~R的区间 我们用线段树维护最大值 看是否有一个位置被覆盖了m次 如果有 更新答案 接着我们压缩L~R区间 (因为我们要最小值 当L越大 差值越小)也就是在 有一个位置被覆盖次数>=m时让L最大 更新完这个答案后 在向后扩展R就行了尺取法的一般步骤是:1.初始时 L=R=02.R向右扩展知道满足条件 3.在第二...原创 2020-07-08 13:33:08 · 135 阅读 · 0 评论 -
CodeForces - 587E 和 无力回天NOI2017 线性基套路+线段树
这两个题十分相似 就放在一起讲了 它们的操作1都相同1 l r x 将区间l到r的数都异或x 这个操作似乎可以线段树区间修改 不过 2操作明显涉及到线性基 如果进行区间修改的话 线性基如何处理在这要用到线性基的一个套路当我们说两个线性基相同的时候 当且仅当它们可以异或出来的数相同 我们先对数组做一个异或差分 那么1操作就变成了l和r+1两处的单点修改 那2操作如何实现 我们观察一下 到这 r-l 个数 是不是可以将到...原创 2020-07-08 08:59:21 · 397 阅读 · 0 评论 -
HDU - 6609 权值线段树
HDU - 6609给一个序列 a 对于每个i 询问最少删除几个数ai(i<ai) 能使得i位置的前缀和小于等于m表述可能不清楚 大家可以自己看题我们将题意转换一下 最少需要删几个数 那这几个数肯定是越大越好 并且 这几个数的和(其中sumi是i位置的前缀和) 那我们先把ai离散化了 然后遍历一次ai数组 每次向权值线段树中插入ai(当然是插入在ai离散化后排名的位置) 分别记录cnt和sum cnt是每个数出现的次数 sum是求和 然后我们在线段树中搜索 如...原创 2020-07-07 15:19:29 · 166 阅读 · 0 评论 -
P6327 区间加区间sin和 线段树
这题挺简单的 不过错的很玄学用公式 sin(a+x)=sina*cosx+sinx*cosa cos(a+x)=cosa*cosx-sina*sinx就行 维护sinx的和和cosx的和更新就行了 需要注意的是常数比较大 三角函数的值尽量只算一次 传递下去就行 然后玄学的地方是 我把lazy[x]+=val;放到cal函数里面会wa 把它单独拿出来写就能过 不知道为什么#include<cstdio>#include<iostream>#include<...原创 2020-06-13 21:25:25 · 334 阅读 · 0 评论 -
P3224 [HNOI2012]永无乡 权值线段树合并
学了线段树合并以后这题感觉瞬间水了,标签是平衡树,平衡树合并还没学的很会,不过线段树合并绝对是最好写的用并查集维护连通性。注意 合并的时候并查集要与线段树合并一致 假如fa[a]=b 那么就要把a合并到b上面去另外的求第k大就是基础操作了#include<bits/stdc++.h>#define R register intusing namespace std;const int N = 1e5+10;int fa[N],rt[N],lc[N*40],rc[N*4..原创 2020-06-09 09:44:15 · 148 阅读 · 0 评论 -
D - Yet Another Yet Another Task 用线段树写水题
a[i]的数据范围瞬间让这题变成了水题 我们枚举区间最大值 (从0到30) 负数没必要 因为当区间长度为1时ans为0 是最小值 我们只保留小于等于这个枚举值的数 然后维护最小前缀和就行了 如果碰到大于枚举值的位置 我们把最小前缀和设为正无穷#include<stdio.h>#include<algorithm>using namespace std;const int N = 1e5+10;int ans,b[N],sum[N];int main(){...原创 2020-05-29 20:59:12 · 2821 阅读 · 0 评论 -
[HEOI2016/TJOI2016]排序 线段树合并+set or 二分+线段树
这题两种主流的做法:1.线段树合并,用set维护树的根结点。合并的时候直接暴力遍历set容器,合并两棵树的复杂度是logn的,分裂原创 2020-05-29 11:53:41 · 645 阅读 · 0 评论 -
洛谷 线段树分裂模板
对于0操作需要把区间x到y分裂出来变成一颗新的树(这像极了fhq的无旋treap) 我也用了类似的思想来实现线段树维护每个权值出现的个数 2,3,4操作应该都不是问题1操作的话就是线段树合并 没有什么特别的地方 对于y结点的删除 可以直接删 也可以把y结点放进内存池 我是用的内存池(不知道是不是这个名字。。。) 就是每删掉一个结点 可以把这个结点放入内存池 新建结点的时候 如果内存池有结点的话就从内存池里面取出结点 否则就新建一个结点 显然内存池可以减少空间复杂度 重复利用一些结点...原创 2020-05-26 11:55:55 · 181 阅读 · 0 评论 -
洛谷 [POI2011]ROT-Tree Rotations 线段树合并
参考博客:https://www.cnblogs.com/JYYHH/p/8777468.html这题从叶子结点开始 从下往上贪心就是正确的 贪心的思路就是 计算出左右两颗子树的顺序对和逆序对 然后取最小 一直向上合并线段树就行了 因此我们要维护siz(叶子节点的个数)#include<bits/stdc++.h>using namespace std;const int N = 2e5+10;int L[N*30],R[N*30],siz[N*30],tot,cnt,n,..原创 2020-05-25 09:22:23 · 180 阅读 · 0 评论 -
线段树合并 CF 600E Lomsat gelral
这题和[Vani有约会]雨天的尾巴有些神似的地方 算是线段树合并的模板题把 每个结点维护一颗线段树 线段树维护颜色出现个数 以及编号和 pushup要写好 想清楚 最后dfs合并起来就行了#include<bits/stdc++.h>using namespace std;const int N = 1e5+10;typedef long long ll;#define ls T[rt].l#define rs T[rt].rll ans[N];int h[N],...原创 2020-05-24 21:19:43 · 176 阅读 · 0 评论 -
差分+线段树合并 [Vani有约会]雨天的尾巴
似乎这题主流做法是树剖 但是树剖怎么做啊 线段树合并我还没怎么学过 所以用线段树合并来做了首先对于每个操作肯定是差分来维护是最方便的 每个点我们建立一颗权值线段树 对于x y z 操作分别在树x,树y,树lca(x,y),树 fa[lca(x,y)] 上的z位置进行+1,+1,-1,-1的操作 这是典型的树上点差分然后我们由下而上的统计每棵树的答案就行了据说这种做法理论上只有nlogn的复杂的 不过常数巨大 可以比 nlognlogn的做法还慢一开始卡了...原创 2020-05-24 16:55:13 · 236 阅读 · 1 评论 -
HDU - 4902 Nice boat 线段树维护最大最小值
题意:1操作让区间l~r的值为x 2操作让区间大于x的值为gcd(x,ai)我们维护区间最大值最小值 当最大值等于最小值时 区间的数都相同 这样可以减少2操作的时间 另外 对于mx[id]<=x的区间我们不必要在更新 也可以剪掉#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int N = 1e5+10;int a[N],ans[N];.原创 2020-05-22 15:10:07 · 289 阅读 · 0 评论 -
HDU多校 - 5316 Magician 线段树
更新的操作很简单 关键是0操作怎么做 我们要求一个子序列的最大和 这个子序列满足每两个相邻的项在原数组中的下标都是奇偶相交的那么肯定有4种情况(用o表示奇,e表示偶):oo,ee,oe,eo用线段树去维护这四种就行啦 注意初值应该是负无穷而不是0#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int N = 1e5+10;int a[N..原创 2020-05-22 13:27:07 · 256 阅读 · 0 评论 -
CF Round #254 (Div. 1) C. DZY Loves Colors
我们维护区间最大值和最小值来判断区间的数是不是都相等 当更新操作更新很大的区间时 其后的更新操作(包括前一个更新区间的)复杂度就会降低 具体的证明我也不大会。。#include<bits/stdc++.h>using namespace std;const int N = 1e5+100;typedef long long ll;struct tree{ int ma,mi,l,r; ll val,lazy;}T[N<<2];void pushup(int..原创 2020-05-15 22:07:04 · 201 阅读 · 0 评论 -
CF Beta Round #19 D. Points 线段树
仔细看这个题是一个偏序问题 我们对x轴建立线段树 线段树上维护y的最大值 因为每个x都对应多个y 所以我们需要在叶子结点开一个set数组对于1,2操作 我们更新即可对于3操作 我们询问 区间 x+1~inf 这应该算个套路了 然后先询问左子树 保证是大于x的最小x 到了叶子结点 在经过set二分来找y 通过维护y的最大值 我们可以保证复杂度#include<bits/stdc++.h>using namespace std;const int N = 2e...原创 2020-05-15 20:56:40 · 192 阅读 · 0 评论 -
Codeforces Round #111 (Div. 2) E. Buses and People 线段树
这很像一个偏序的问题 但是我们要用线段树来解决它 仔细想想cdq应该也可 但是写起来比较麻烦我们就写线段树首先我们把人和车都按上车起始点排序 这样可以减少一维剩下还有终止点和时间这两维 我们对时间离散化 并且以时间(车辆的信息)开一棵线段树维护终止点的最大值 以及车辆的编号(应该是不存在时间相同的车的)对于每辆车 我们更新对应时间点的终止点以及车辆编号对于每个人 我们根据维护的终止点最大值 在pos~tot的区间上 去找最左端的合法点pos是这个人的时间离散后排的位...原创 2020-05-15 15:17:29 · 958 阅读 · 0 评论 -
科大讯飞杯 H-时空栈 线段树
题目链接:https://ac.nowcoder.com/acm/contest/5477/H题目有个要点就是 每个时间点t都只会出现一次 这样对于0操作 我们可以把它入栈的值放在这个时间点 对于入栈操作 我们把对应的时间点+1,对于出栈操作 我们把对应的时间点-1 然后我们来研究一下对于每次询问我们要找哪个点 (需要离散化时间点)区间 1 2 3 4 5 6 7值 - - - - - - -标记 0 0 0 0 0 0 0后缀和 0 0 0 0 0 0 0一开始是这样的...原创 2020-05-15 09:55:48 · 518 阅读 · 0 评论 -
hdu 1823 线段树(非二维做法)
都说这题是二维线段树裸题,不过我二维线段树有点麻烦 也不太想写(还是得学的) 我就直接开200棵线段树了 这种方法在某一维很小的时候 是完全适用的 复杂度最多 100*1000*log(1000) 完全不虚#include<cstdio>#include<cstring>#include<algorithm>using namespace s...原创 2020-05-05 09:54:51 · 843 阅读 · 0 评论 -
Gym - 100543B(BZOJ 4049 or UVALive 6928) 线段树维护凸包+二分
打湖南多校遇见的这套题 (Gym 100543B) 我们队做了四个水题 就不会了 其他题感觉难度都有所提高 还是得加强训练突破中档题本题链接:https://vjudge.net/contest/371507#problem/B先说明的是bzoj上似乎是单样例 UVA和cf上是多样例 另外个人建议拿cf交 UVA经常崩 什么对的代码提交wa的 也遇到过好几次了本题的思路来自大佬...原创 2020-05-03 18:29:05 · 319 阅读 · 0 评论 -
HDU-6602 杭电多校 线段树
题目链接:hdu 6602博客思路源自博客:https://blog.nowcoder.net/n/bdacd5d54bdc491ea71ece169c860f39感觉多校的题目还是比较重思维 而饿我的思维很菜这题我一开始想了个假算法,因为要个数>=k或者==0,一开始我想着用主席树,先二分一个长度len,再去枚举左端点,假设枚举到了左端点为L 那么右端点R=L+len-...原创 2020-04-28 16:51:18 · 236 阅读 · 0 评论 -
poj 2376 线段树优化dp
题意:选出最少数量的线段 覆盖整个区间我们先考虑如何dp,先把所有线段按照 排序,为什么要按排序 因为它代表了一条线段能覆盖到的最右区间,这个值会对后面的dp转移有影响,相反不可以。 然后我们遍历所有线段,用表示覆盖区间 1 到 ri 处用的最少的线段数量 考虑何转移:显然我们要搜查区间最小值,并且需要支持更新,那么我们就要用到线段树来优化这个过程初始化其他为i...原创 2020-04-19 12:34:36 · 335 阅读 · 0 评论 -
牛客 19246 数据结构 线段树维护区间平方和
回顾一下线段树求幂次方和的操作#include<bits/stdc++.h>using namespace std;const int N = 1e4+100;typedef long long ll;struct segtree{ #define lson id<<1,l,mid #define rson id<<1|1,mid+1,r...原创 2020-04-11 00:37:54 · 323 阅读 · 0 评论 -
牛客 17383 A Simple Problem with Integers 线段树+循环节
这题也算是线段树比较新奇的玩法了题意:给一个序列A1操作是令区间a,b内 Ai = (Ai*Ai)%20182操作是求区间a,b内Ai的和(不需要余2018)我们发现线段树很难去进行第一个操作 在我们已知的范围内 无法高效的进行区间内每个值平方再取余的操作一个很难(我反正想不到)想到的操作是 寻找 循环节 我们先观察一下 写出如下代码for(int i ...原创 2020-04-10 21:42:43 · 191 阅读 · 0 评论 -
牛客 15667 统计颜色 线段树+状压
题目链接:统计颜色cf上面好像做过一样的题 但是那个太难找了 为啥要贴呢 因为有时候总想不到这个状压(主要是tcl)其实一般能不能状压 都有提示 比如数据范围在 63以内啊 这时候就可以用 longlong 来状压了我们发现维护 区间有几种颜色很难 (有更新操作) 但是观察颜色最多才60种 那我们拿一个ll来代表 颜色 如果第i种颜色有的话 那这个ll值的第i...原创 2020-04-05 13:55:14 · 186 阅读 · 0 评论 -
CodeForces - 1108E2 线段树+扫描线思想
题意:要我们从m个区间中选任意个区间进行减一 操作 保证最后整个区间极差最大首先我们思考一下 当我们选的区间包含了最小值的时候 有两种情况:最大值包含在内 极差不变 最大值不包含在内 极差+1可见当最小值包含在一个区间内时,答案不会变差 那我们直接枚举区间 然后看当前最小值在不在这个区间不久行了 这样显然不行 其一 最小值有多个 其二也是关键一点 最小值不一定保...原创 2020-04-05 13:02:44 · 405 阅读 · 0 评论 -
CodeForces - 1114F 线段树+欧拉函数+状压
一开始不想求逆元 想着用乘法维护 及 其中pj是ai积所包含的质因子 k是每个质因子出现的次数,所有我开了63*2个树状数组来维护每个质因子的个数,然后果断超时了 。。后来看了题解才知道 就是从欧拉函数的原始公式下手 那我们要维护的就是区间l到r的积以及 区间出现的质因数种数(对应到值) 第一个很好维护 那第二个怎么维护呢 需要状压 我们可以发现 300以内...原创 2020-04-03 08:24:55 · 196 阅读 · 0 评论 -
CodeForces - 1089K 线段树维护最大后缀和
首先要读懂题吧 任何骑士进入的时间大于 询问的t都不用考虑 而到达时间小于t的询问 我们要找出他们离开的最大值 他们全离开后才是公主进入的时间 我们询问1到t的最大后缀和 用这个时间减去t就是等待时间了#include<bits/stdc++.h>using namespace std;const int N = 1e6+10;typedef long ...原创 2020-04-01 19:56:36 · 168 阅读 · 0 评论 -
2018-2019 ICPC, NEERC, Southern Subregional Contest C题 线段树
题目描述:DescriptionBuber is a Berland technology company that specializes in waste of investor's money. Recently Buber decided to transfer its infrastructure to a cloud. The company decided to rent ...原创 2019-10-02 21:24:27 · 178 阅读 · 0 评论