![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
线段树
线段树
mfy的1号小迷弟
一个没有对象的野指针qaq
展开
-
洛谷P2839 [国家集训队]middle(二分 + 主席树 + 区间合并)
洛谷P2839 [国家集训队]middle(二分 + 主席树)题意:一个长度为 nnn 的序列 aaa,设其排过序之后为 bbb,其中位数定义为 bn/2b_{n/2}bn/2 ,其中 a,ba,ba,b 从 000 开始标号,除法取下整。给你一个长度为 nnn 的序列 sss。回答 QQQ 个这样的询问:sss 的左端点在 [a,b][a,b][a,b] 之间,右端点在 [c,d][c,d][c,d] 之间的子区间中,最大的中位数。其中 a<b<c<da<b<c&l原创 2021-07-09 16:41:46 · 3367 阅读 · 0 评论 -
洛谷P2486 [SDOI2011]染色(树链+线段树 + 树上区间合并 )
洛谷P2486 [SDOI2011]染色(树链+线段树 + 树上区间合并 )题意:给定一棵 n 个节点的无根树,共有 m 个操作,操作分为两种:将节点 a 到节点 b 的路径上的所有点(包括 a 和 b)都染成颜色 c。询问节点 a 到节点 b 的路径上的颜色段数量。颜色段的定义是极长的连续相同颜色被认为是一段。例如 112221 由三段组成:11、222、1思路:树上区间合并时,考虑上一次的边界#include <bits/stdc++.h>using namespace s原创 2021-07-08 21:12:47 · 89 阅读 · 0 评论 -
洛谷P3313 [SDOI2014]旅行(树链+边权转点权)
洛谷P3313 [SDOI2014]旅行(树链+边权转点权)#include <bits/stdc++.h>using namespace std;#define lson rt<<1,l,mid#define rson rt<<1|1,mid+1,rtypedef long long ll;const int INF=0x3f3f3f3f;const int maxn=2e5+100;int n,m,k,tot,a[maxn],siz[maxn],fa[原创 2021-07-08 17:53:14 · 95 阅读 · 0 评论 -
洛谷P3313 [SDOI2014]旅行(树剖+线段树动态开点)
洛谷P3313 [SDOI2014]旅行(树剖+线段树动态开点)题意:“CC x c“:城市x的居民全体改信了c教;“CW x w“:城市x的评级调整为w;“QS x y“:一位旅行者从城市x出发,到城市y,并记下了途中留宿过的城市的评级总和;“QM x y“:一位旅行者从城市x出发,到城市y,并记下了途中留宿过的城市的评级最大值。思路:对每种信教开一颗线段树,动态开点#include <bits/stdc++.h>using namespace std;#define ls原创 2021-07-08 15:39:28 · 127 阅读 · 0 评论 -
洛谷P3168 [CQOI2015]任务查询系统(主席树 + 差分 +区间前k小和)
洛谷P3168 [CQOI2015]任务查询系统(主席树 + 差分 +区间前k小和)题意:。。。思路:因为对于任务来说,对一段区间是有用的,于是我们可以用差分来表示区间,然后主席树维护前缀区间和即可。然后因为我们是求和,我们同时主席树也要维护区间的数字个数,因为求K小和。但是有可能当前区间的有a个相同的数字,我们求b个和,然后b<a,然后我们就需要返回 sum*b/a ,不然就会一直只有80分。#include<bits/stdc++.h>using namespace .原创 2021-07-07 21:24:59 · 187 阅读 · 0 评论 -
【绝世好题】HDU 6155 Subsequence Count(dp+线段树+维护矩阵乘)
题意:给出一个长度为n的01串s,两种操作:1.反转区间[l,r],即把0变成1,把1变成02.询问区间[l,r]中不同的子序列个数思路:#include<bits/stdc++.h>using namespace std;#define lson rt<<1,l,mid#define rson rt<<1|1,mid+1,rtypedef long long ll;typedef pair<int,int>pii;const ll IN原创 2021-07-07 11:57:02 · 148 阅读 · 0 评论 -
洛谷P2633 Count on a tree(主席树 + 最短距离LCA)
洛谷P2633 Count on a tree(主席树 + 最短距离LCA)题意:给定一棵 nnn 个节点的树,每个点有一个权值。有 mmm 个询问,每次给你 u,v,ku,v,ku,v,k,你需要回答u xor lastu \text{ xor last}u xor last 和 vvv 这两个节点间第 kkk 小的点权。其中 last\text{last}last 是上一个询问的答案,定义其初始为 0,思路:root[i]root[i]root[i]表示原创 2021-07-06 18:06:16 · 107 阅读 · 0 评论 -
洛谷P3384 【模板】轻重链剖分/树链剖分
洛谷P3384 【模板】轻重链剖分/树链剖分已知一棵包含 NN 个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作:1 x y z,表示将树从 xx 到 yy 结点最短路径上所有节点的值都加上 zz。2 x y,表示求树从 xx 到 yy 结点最短路径上所有节点的值之和。3 x z,表示将以 xx 为根节点的子树内所有节点值都加上 zz。4 x 表示求以 xx 为根节点的子树内所有节点值之和#include <bits/stdc++.h>using namespac原创 2021-07-03 21:41:38 · 109 阅读 · 0 评论 -
洛谷P1502 窗口的星星(线段树+扫描线+离散化)
洛谷P1502 窗口的星星(线段树+扫描线+离散化)题意:平面上有一些星星坐标为(x,y)权值为v,用一个长为H,宽为W的铁窗户框去框住尽量多的星星使得权值最大。铁边框上的不算在内。思路#include<bits/stdc++.h>using namespace std;typedef long long ll;#define lson rt<<1,l,mid#define rson rt<<1|1,mid+1,rconst int maxn=2e4+5原创 2021-07-03 20:38:38 · 158 阅读 · 0 评论 -
【线段树扫描线】周长+面积
面积#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=2e5+5;int n,m1=1e9,m2=-1e9,last,ans;struct node{ int l,r,f,h; bool operator < (const node &x)const{ if(h!=x.h)return h<x.h; return f>x.f; }}e.原创 2021-07-03 10:06:27 · 83 阅读 · 0 评论 -
【洛谷P4513】小白逛公园(线段树+区间的合并)
题意:维护一个有nn个元素的序列,支持单点修改和查询区间最大子段和思路:#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=5e5+5;int n,m;ll a[maxn];struct NODE{ ll ans,sum,ml,mr,l,r;}tree[maxn<<2];void pushup(int rt){ tree[rt].sum=tree[rt&原创 2021-07-02 18:14:42 · 77 阅读 · 0 评论 -
CodeForces - 343D Water Tree(树链剖分+线段树)
CodeForces - 343D Water Tree(树链剖分+线段树)题意:给出一棵树,然后给出m次操作,每次操作分为三种:1 v:将v及其子树全部变为12 v:将v及其祖先全部变为03 v:查询点v的值思路:直接模拟#include <bits/stdc++.h>using namespace std;#define lson rt<<1,l,mid#define rson rt<<1|1,mid+1,rtypedef long long原创 2021-07-02 13:44:19 · 69 阅读 · 0 评论 -
HDU - 6393 Traffic Network in Numazu(线段树+LCA+树链剖分+并查集)
HDU - 6393 Traffic Network in Numazu(线段树+LCA+树链剖分+并查集)题目大意:给出一个由n个点和n条边组成的图,每条边都有权值,题目保证图是连通的,然后给出m个询问,每次询问分为两种形式:0 x y:将第x条边的权值修改为y1 x y:查询x-y这条路径上的权值和#include<bits/stdc++.h>using namespace std;#define lson rt<<1,l,mid#define rson rt<原创 2021-07-01 15:20:26 · 75 阅读 · 0 评论 -
牛客练习赛56 D.小翔和泰拉瑞亚 (线段树)
牛客练习赛56 D.小翔和泰拉瑞亚 (线段树)题意:有n个数组成的序列,你有m种操作,每次选择[ l , r ] [l,r][l,r]区间减去w,你可以从m次操作中任意选择一些操作完成,求完成后整个序列的最大最小值之差最大是多少思路:将操作区间按左下标从小到大排序,从1到n遍历,假设当前i为最小值下标,把操作区间包含i的全部更新用线段树更新区间,遍历完i后,更新ans。再把遍历过的区间的右下标小于i的全部在线段树中删除其贡献。#include<bits/stdc++.h>using原创 2021-06-22 15:42:25 · 109 阅读 · 0 评论 -
ZOJ 4009 And Another Data Structure Problem (线段树+循环节+标记永久化)
ZOJ 4009 And Another Data Structure Problem (线段树+循环节+标记永久化)题意:1个序列有n个元素,有2种操作1. l,r 把[l,r]元素变成al3,al+13,al+23....ar3a_l^3,a_{l+1}^3,a_{l+2}^3....a_r^3al3,al+13,al+23....ar32. l,r 求[l,r]区间和,取模99971思路:显而易见, 任何数模99971有一个48位的循环节~~(不然这题没法做了)~~原创 2021-06-21 21:46:57 · 77 阅读 · 0 评论 -
2019ICPC0南昌 K Tree (树上启发式和并+动态开点线段树)
2019ICPC0南昌 K Tree (树上启发式和并+动态开点线段树)题意:有一棵树,每个点都有权值vi,求满足以下三个条件的点对个数1.这两个点不能互为祖先节点2. 这两个点之间的最短距离不能超过k3.这两个点的最近公共祖先节点的权值*2等于这两个点权值之和思路:对于第三个要求,可以考虑用树上启发式和点分治,但明显树上启发式好写,同时也好处理第二个要求。设以当前为根节点时,遍历其所有儿子时,对每一种节点的权值以其为根节点,开一个线段树,叶子节点从1到n代表深度,统计同一权值的各种深度。都是原创 2021-06-21 16:13:35 · 140 阅读 · 0 评论 -
2020CCPC威海站 G Caesar Cipher (线段树维护哈希)
2020CCPC威海站 G Caesar Cipher (线段树维护哈希)题意:给定你n和q,然后给定你一个长度为n的序列,q次操作,每次操作有两种形式:1 x y:代表从序列的第x项到第y项所有的(a[i] + 1) mod 655362 x y l:表示从询问分别以x和y为起点的两个序列,然后这两个序列是否完全相同,输出yes或no思路:对于操作1,可以直接用线段树维护对于操作2,多加一个hash数组进去,存储每个区间的hash值。判断时,通过比较区间的hash值,从而判断是否相等。对于原创 2021-06-20 22:46:50 · 173 阅读 · 0 评论 -
2019 ICPC Asia Jakarta Regional Contest G. Performance Review (线段树)
2019 ICPC Asia Jakarta Regional Contest G. Performance Review (线段树)题意:一个公司有n个人,每年有若干个人应聘,每次都会开除排名倒数的若干个人并将所有应聘的人招进公司,接下来有q次修改,每次可以修改每年应聘人的能力值,并询问1号员工能否在m年后仍然在公司思路:预处理,b[i]表示 有多少个元素比第一个元素小 。对b[]建立线段树。每次询问则是区间更新,判断sum[1]>=0则输出1,否则0#include <bits/s原创 2021-06-20 15:14:58 · 104 阅读 · 0 评论 -
2019 ICPC Asia Jakarta Regional Contest K. Addition Robot (线段树+矩阵乘法)
2019 ICPC Asia Jakarta Regional Contest K. Addition Robot (线段树+矩阵乘法)题意:有一个长度为N的字符串,只含有AB两种字符,接下来有2种操作1.l r 将区间[l, r]内的A变成B,B变成A2.l r a b 在区间[l, r]内,如果遇到A,a变成a和b之和,反之,b变成a和b之和,并输出最终的a b思路:对于操作二:遇到A其实就相当于(a,b) * (1 0 1 1)遇到B其实就相当于(a,b) * (1 1 0 1)操作原创 2021-06-19 22:46:54 · 155 阅读 · 0 评论 -
Codeforces Round #705 (Div. 2)D. GCD of an Array(线段树动态开点or set+map)
Codeforces Round #705 (Div. 2)D. GCD of an Array(线段树动态开点or set+map)题意:有n个数,每回合可以对某个位置的数乘x,并求出所有数的gcd思路:把a1质因数分解,pi表示各质因子,xi表示幂a1=p1x11∗p2x12∗p3x13a1={p_1}^{x_{11}}*{p_2}^{x_{12}}*{p_3}^{x_{13}}a1=p1x11∗p2x12∗p3x13…a2=p1x21∗p2x22∗p3x23a2={p_1}^{原创 2021-06-19 20:30:01 · 120 阅读 · 0 评论 -
2021牛客寒假算法基础集训营6.H.动态最小生成树(线段树+kruskal)
https://ac.nowcoder.com/acm/contest/9986#submit/{%22onlyMyStatusFilter%22%3Atrue%2C%22problemIdFilter%22%3A%22218554%22}原创 2021-06-18 22:53:42 · 1210 阅读 · 0 评论 -
2021牛客寒假算法基础集训营3 E 买礼物 (线段树+链表)
2021牛客寒假算法基础集训营3 E 买礼物 (线段树+链表)题意:有n个礼物,每个礼物都有不同的编号,下面有m次操作1. 拿走x位置的礼物2.询问[x,y]区间内是否存在两个一样的礼物思路:1.预处理:因为只需要区间内两个数一样,可以用两个链表,一个存下标在当前位置元素之前,且编号相同的元素的下标,一个存下标在当前元素之后,且编号相同的元素的下标。2.用线段树维护nex数组,区间询问则转换成,求当前区间最小值是否小于y。若小于则存在,否则不存在。删除则把x位置元素改为INF,并改变pre[n原创 2021-06-18 18:06:19 · 112 阅读 · 0 评论 -
Codeforces Round #698 (Div. 2)E. Nezzar and Binary String(线段树+离线+异或)
Codeforces Round #698 (Div. 2)E. Nezzar and Binary String(线段树+离线+异或)题意给你两个01字符串,要求从第一个字符串转换成第二个字符串,并满足以下要求每次给定一个检查区间,要求这个区间内必须是单一的0或1你可以在检查之后偷偷修改严格小于区间一半的字符数如果可以转换成功输出YES,否则输出NO思路:将检查区间,从后往前遍历,则,对于当前检查的区间,之前一定是全0或者全1,所以将当前检查区间和*2与区间长度作比较,若相等则输出NO,若小原创 2021-06-18 15:59:36 · 103 阅读 · 0 评论 -
牛客练习赛73.D.离别(线段树+离线)
牛客练习赛73.D.离别(线段树+离线)题意:给定一个长度为n的数列,每次询问一个区间(L, R),求满足区间内最大出现次数等于k次的子区间个数思路:1.预处理:对于每个节点,以其为右区间端点,设[li,ri][li,ri][li,ri]为其左区间端点的取值范围,此区间满足出现对多的数为 kkk。可以用队列存储每个数字出现的位置,当队列长度等于kkk时,更新rir_iri,当队列长度大于kkk时,更新lil_ili,再更新rir_iri。可以O(n)O(n)O(n)实现。2.离线询问:在以q原创 2021-06-18 12:03:22 · 93 阅读 · 0 评论 -
【线段树】E. Danil and a Part-time Job(dfs序+线段树)
【线段树】E. Danil and a Part-time Job(dfs序+线段树)题意:一棵树每个节点的权值只有0和11.get x表示求x的子树权值和2. pow x表示把x及的子树^1#include<bits/stdc++.h>using namespace std;const int maxn=4e5+5;int n, q,cnt,dfn[maxn],low[maxn],id[maxn];int val[maxn], lazy[200009 << 2],原创 2021-06-10 19:40:12 · 57 阅读 · 0 评论 -
线段树维护方差
我们把方差公式展开所以只需要维护一个区间平方和和区间和当我们更新一个区间加时#include <cstdio>#include <iostream>#define lson rt<<1,l,mid#define rson rt<<1|1,mid+1,r#define Maxn 300010using namespace std;double tree1[Maxn],tree2[Maxn],a[Maxn],lazy[Maxn];void原创 2020-11-23 13:51:27 · 151 阅读 · 0 评论 -
【线段树】区间异或,正常求和
给定 nn 个数的序列 aa。mm 次操作,操作有两种:1.求 ∑i=lrai\displaystyle\sum_{i=l}^r a_ii=l∑rai2.把al∼ara_l\sim a_ral∼ar异或上xconst int MAXN = 100005, MAXW = 25;int n, v[MAXW][MAXN];struct Segment_tree { int n, val[MAXN << 2], tag[MAXN << 2]; void Clear()原创 2021-06-09 22:18:25 · 419 阅读 · 0 评论