线段树
穷源溯流
路很长,尽管走便是。
展开
-
Gym The 15th Heilongjiang Provincial Collegiate Programming Contest B. Bills of Paradise(权值线段树+区间操作)
const int N=1e6+5; int n,m,_; int i,j,k; //int a[N];unsigned long long k1, k2;unsigned long long xorShift128Plus() { unsigned long long k3 = k1, k4 = k2; k1 = k4; k3 ^= k3 << 23; k2 = k3 ^ k4 ^ (k3 >> ...原创 2021-05-06 13:43:34 · 339 阅读 · 0 评论 -
Gym The 17th Zhejiang Provincial Collegiate Programming Contest B. Bin Packing Problem(线段树+map)
const int N=1e6+5; int n,m,_; int i,j,k; int a[N]; struct Node { int l,r; int maxx; #define lson id<<1 #define rson id<<1|1 }t[N<<2]; multimap<int,int> mp;void push_up(.原创 2021-05-05 10:16:46 · 321 阅读 · 0 评论 -
Gym The 13th Chinese Northeast Collegiate Programming Contest H. Skyscraper(线段树+差分)
前置题目:BLOGconst int N=1e5+5; int n,m,_; int i,j,k; ll a[N]; ll d[N]; struct Node { int l,r; ll sum,plu; #define lson id<<1 #define rson id<<1|1 }t[N<<2];void push_up(...原创 2021-05-04 09:37:38 · 175 阅读 · 0 评论 -
Gym 2019 Sichuan Province Programming Contest A. Autochess(线段树+STL瞎搞)
const int N=1e5+5; int n,m,_; int i,j,k; //int a[N]; map<string,vector<int>> mp; vector<string> ans; int len; struct Node { int l,r; int sum; #define lson id<<1 ...原创 2021-05-03 09:50:28 · 672 阅读 · 3 评论 -
HDU 6483 A Sequence Game(主席树+线段树)
const int N=1e5+5; int n,m,_; int i,j,k; int a[N]; struct Node { int l,r; int sum; }t[N<<5]; int root[N],tot=0; map<int,int> vis; void update(int &x,int y,int pos,int c,int l,int...原创 2021-04-24 16:20:34 · 159 阅读 · 0 评论 -
洛谷 P3792 由乃与大母神原型和偶像崇拜(线段树+思维)
const int N=5e5+5; int n,m,_; int i,j,k; int a[N]; struct Node { int l,r; int minn,maxx; ll sum; #define lson id<<1 #define rson id<<1|1 void update(int x){ ...原创 2021-04-03 10:54:46 · 152 阅读 · 0 评论 -
洛谷 P1712 [NOI2016] 区间(线段树+贪心+思维)
const int N=5e5+5; int n,m; int i,j,k; int a[N]; struct Node { int l,r; int ll,rr; bool operator<(Node o){ //if(o.r==r) return l<o.l //return r<o.r; retu...原创 2021-03-31 20:34:56 · 180 阅读 · 1 评论 -
洛谷 P1937 [USACO10MAR]Barn Allocation G(线段树+贪心)
const int N=1e5+5; int n,m; int i,j,k; int a[N]; struct Node { int l,r; void read(){ sdd(l,r); } bool operator<(Node o){ if(r==o.r) return l<o.l; return r<o.r; ...原创 2021-03-31 19:30:36 · 248 阅读 · 0 评论 -
洛谷 P3924 康娜的线段树(线段树+数学)
const int N=1e6+5; int n,m; int i,j,k; int a[N]; struct Node { int l,r; ll sum; #define lson id<<1 #define rson id<<1|1 }t[N<<2]; ll ans=0,sum[N]; int depth,de...原创 2021-03-31 16:17:34 · 201 阅读 · 0 评论 -
ABBYY Cup 3.0 E3. Summer Homework(线段树+思维+斐波那契)
题目就是要求完成上述操作,每次操作 2,都要输出结果const ll mod=1e9;const int N=2e5+5; int n,m; int i,j,k; int a[N]; ll f[N],sum[N]; struct Node { int l,r,len; ll s1,s2,lazy; void init(int l,int r){ ...原创 2021-03-15 17:27:30 · 238 阅读 · 0 评论 -
Codeforces Beta Round #75 (Div. 1 Only) B. Queue(权值线段树)
给出 n 个数,对于每个数找到其最右边比他严格小的数,问这两个数之间的距离是多少,如果没有输出 -1利用权值线段树将每个点的位置放到权值上,当然先要进行离散化,我们需要先添加最右边的数,但是一定要注意到可能有相同的元素,那么一定要取位置最大的那个const int N=1e5+5; int n,m; int i,j,k; int a[N]; vector<int> v,res; struct Node { ...原创 2021-03-13 15:13:40 · 192 阅读 · 0 评论 -
Codeforces Round #296 (Div. 2) C. Glass Carving(端点线段树)
给出一个矩形的长和宽,以及操作次数 n将这个矩形放到一个坐标系中,每次操作可以沿 x 轴方向或 y 方向切一刀,每次操作后,输出这些小矩形中面积最大的矩形可以将题目转化为开始时 1~x 中每一条长度为 1 的线段都是 1,被切断的那个为 0,那么只要统计区间的最长连续 1 的个数,利用端点线段树可以解决问题 const int N=2e5+5; int n,m; int i,j,k; //int a[N]; struct Node {...原创 2021-03-10 17:25:57 · 136 阅读 · 0 评论 -
Codeforces Round #167 (Div. 2) C. Dima and Staircase(线段树)
题意看看图例还是很好明白的,给出 n 个数,分别表示方块的个数,给出 m 次更新,每次更新输入一个长方形的长和宽,长方形从 1 位置开始落下,每次落下后输出此长方形落在第几块方格上利用线段树,每次询问 [1,l] 的最大值,然后区间更新 [1,l] 的最大值+w,(好像不用更新也可以)const int N=2e5+5; int n,m; int i,j,k; int a[N]; struct Node { ...原创 2021-03-10 08:40:48 · 132 阅读 · 0 评论 -
Manthan, Codefest 17 B. Marvolo Gaunt‘s Ring(线段树+思维)
有 n 个数,以及 p,q,r要求找到三个数 使得最大,其中由于题目具有后效性,开始没有注意到,枚举 i∈[1,n] 使得 a[i]*p,然后用线段树找到 j∈[i,n] 使得 a[j]*q,再找到 k∈[j,n] 使得 a[k]*r,但是这样的做法是不对的,只能过到 12 个样例因为每一步都是最优的,并不能代表整体最优如果枚举 j,在从区间 [1,j] 和 [j,n]分别找 i 和 k 的话这样是正确的,其余上述的做法不同的是,上述做法没有考虑后效性而缩小了区间范...原创 2021-03-08 19:59:59 · 205 阅读 · 0 评论 -
Codeforces Round #193 (Div. 2) B. Maximum Absurdity(线段树+思维)
题目要求我们找到两个长度为 k 的不相交的子段,使得这两个子段之和最大,输出这两个子段的左端点先将 [k,n] 的长度为 k 的子段和求出来,将其放入线段树中,然后枚举区间 i∈[k,n],使 i 作为第一段子段,再在 [i,n] 区间内寻找最大子段即可,保存最大值和答案const int N=2e5+5; int n,m; int i,j,k; int a[N]; ll sum[N],seg[N]; struct Node ...原创 2021-03-08 15:41:35 · 116 阅读 · 0 评论 -
Codeforces Round #569 (Div. 1) C. Serge and Dining Room(权值线段树+思维)
有 n 件商品,m 位顾客依次购买,每一位顾客若可以支付得起某件商品的价格,那么他将会拿走在支付范围内的最贵的商品,如果不能,那么将直接离开;有 q 次更改,每次更改输入三个数 opt,id,val将 id 件商品的价格更改为 val 将 id 位顾客的所持货币更改为 val每次更改结束后,输出柜台上最大的商品的价格设最后剩下来的商品的最大价格为,那么如果有这 件商品的价格大于 ,那么一定有这位顾客所持有的货币,对于任意的,都有,所以最后的任务就...原创 2021-03-06 16:56:39 · 153 阅读 · 0 评论 -
Codeforces Round #207 (Div. 1) A. Knight Tournament(线段树)
有 n 个人,m 场比赛,每场比赛给出 [l,r] 区间内的胜利者 x,表示 [l,r] 全被被 x 打败,但是每个人只能失败一次,问每个人被谁打败,胜者输出 0用线段树可以轻松解决区间覆盖问题,输出用单点查询;这题竟然可以用 set 做,长见识了const int N=3e5+5; int n,m; int i,j,k; int a[N]; struct Node { int l,r; int ...原创 2021-03-06 13:34:00 · 183 阅读 · 0 评论 -
Codeforces Round #698 (Div. 2) E. Nezzar and Binary String(思维+线段树)
给出两个长度为 n 的 01 字符串,给出 m 次操作,问 m 次操作过后是否可以将第一个字符串变为第二个字符串每次操作将 [l,r] 内的字符严格小于 (r-l+1) 的字符串反转,即 1 变为 0,0 变为 1,最多反转 (r-l) 个字符 如果没有严格小于区间长度一半的字符,那么这段字符将被丢弃题目说明两个字符串长度全为 n,所以只要长度不改变就好我们将第二个字符反向操作,看是否能将其变为第一个字符串,区间覆盖问题,利用线段树求解最后再一个一个进行询问...原创 2021-01-31 22:53:09 · 188 阅读 · 1 评论 -
洛谷 P3097 [USACO13DEC]Optimal Milking G(线段树+dp)
题目中的修改为基本操作,但是究竟要维护什么,值得我们去讨论其实很容易想到左端点到底要不要,如果左端点要是一种情况,左端点不要有是一种情况当选择左端点时,最优的时候是不是将奇数位置上的所有点都取,还是说中间要变,这便是我们熟悉的动态规划线段的每一个点都维护一个区间内部端点的选择情况 f[i][j] 当 i =0 时,表示左端点不取,j = 0 时,表示右端点不取这样在 push_up() 函数中应用动态规划即可const int N=4e4+5;#define int ...原创 2021-01-19 10:08:39 · 225 阅读 · 0 评论 -
洛谷 P2894 [USACO08FEB]Hotel G(端点线段树)
题目中更新操作为基本操作,查询操作比较难想查询时判断当前节点的左儿子是否满足有连续 x 的空位,或者左儿子与右儿子之间相连是否有连续 x 个空位 ,或者右儿子单独有 x 个连续的空位这样不禁令人想到一个题目 :https://baichuan.blog.csdn.net/article/details/110532388对于每一个节点维护该节点最长连续 sum 个空位 ,从左端点开始有 lsum 个空位,从右端点有 rsum 个空位这样查询操作就可以解决了const ...原创 2021-01-17 14:59:18 · 226 阅读 · 0 评论 -
洛谷 P7119 Mivik 的游戏(线段树)
这题模拟一下样例可以发现最后要求的是题目做的有点久了,就直接拿来用了(转载至 洛谷)其中 pi 是硬币反面的位置,k 是区间内硬币反面的个数const int N=1e6+5; int i,j,k; int n,m; //int a[N]; struct Node { int l,r; ll sum; //pi ll lazy,cnt; //cnt 为反面硬币数 ...原创 2021-01-14 16:30:09 · 292 阅读 · 0 评论 -
洛谷 P5889 跳树(线段树)
题目对于二叉树的知识点的考察直接拉满其实很容易发现对于只有 1,3 的序列是很容易维护的,但是同时要维护右儿子,需要清楚到底要维护什么设当前序列已经有 x 个有效的右儿子,(有效的意思是没有被访问父节点的操作抵消掉)那么其对答案的贡献值应该是剩下的就是找到有多少个有效的右儿子即可,由于这个序列会构成一棵树那么树的根,也就是深度最低的那个节点开始才记录有效的右儿子,不仅仅是右儿子,还有左儿子既然要维护树的根,不妨将维护这个序列转化为维护树的根,与树的右子树的深度...原创 2020-12-19 13:12:50 · 835 阅读 · 1 评论 -
洛谷 P5142 区间方差(线段树+数论)
关于求方差的题目之前做过,所以问题不算很难和这道题目很像:https://baichuan.blog.csdn.net/article/details/110707826区别是这道题目要用逆元求解,利用费马小定理预处理出前 n 个数的逆元即可解决问题const ll mod=1e9+7;const int N=1e5+5; int i,j,k; int n,m; ll a[N]; struct Node { int ...原创 2020-12-19 08:47:50 · 400 阅读 · 1 评论 -
洛谷 P4879 ycz的妹子(线段树)
题目有几处描述的不太准确,以至于以为是模板题D 的时候表示的是第 x 个有妹子的城市,而不是第 x 个城市好吧,做题的时候没注意到,剩下的就简单了,只有 D 操作和普通的线段树有所不同const int N=5e5+5; int i,j,k; int n,m; int a[N]; struct Node { int l,r; ll sum; int cnt; #defin...原创 2020-12-14 23:10:22 · 209 阅读 · 0 评论 -
洛谷 P2073 送花(权值线段树)
这个题如果要用线段树的话首先要考虑如何建树,那一定是动态开点了而且要维护最大值最小值,但是最气人的是有删点操作,所以在添加的时候要判断是否有节点为空。最后还有一个条件,相同的价格还不允许重新加入,看到这里应该要换思路了既然满足不重复的条件,想到之前有道 multiset 的题,题目用权值线段树解决删点时向区间最左或最右靠拢即可,添加时判断点是否早已存在const int N=1e6+5; int i,j,k; int n,m; //int a[...原创 2020-12-14 09:14:30 · 207 阅读 · 1 评论 -
洛谷 P1558 色板游戏(线段树+位运算)
由于 T 不超过 30 ,所以根据位运算,每一位代表一种颜色,利用在线段树上的或操作即可求得有多少个 1,统计 1 的个数即可注意 1<<(k-1) 代表的是二进制的第 k 位const int N=1e5+5; int i,j,k; int n,m; int a[N]; struct Node { int l,r; int sum,lazy; void update(int val)...原创 2020-12-10 21:47:19 · 298 阅读 · 0 评论 -
洛谷 P1471 方差(线段树+数学)
对于操作 1,2 应该很简单可以实现,但是操作 3,该如何实现,一定是要经过转化的,利用线段树,很容易求得任意区间的和,现在只剩下求 这一块的值为多少即可emmmmm,以我现在的数学能力是没有办法在化简了,但是我们可以用线段树再来维护一下这个值当区间 +k 操作时,那么有 这样区间平方和也变得可以维护了const int N=1e5+5; int i,j,k; int n,m; double a[N]; struc...原创 2020-12-05 19:01:06 · 437 阅读 · 0 评论 -
洛谷 P1438 无聊的数列(线段树+差分)
一开始的时候也是没有思路,但是看到了考点里有差分对于区间更新:对 l 位置 +k 对区间 [l+1,r] +d 对 r+1 位置 -(k+(r-l)*d)那么单点查询变成了a[p]+sum[p](sum[p] 为差分的前缀和)当然要注意,在更新区间时,要判断 l+1 与 r 的大小关系,以及对 r+1 位置的更新时,可能涉及到第 n+1 个数,所以在建树过程中不妨多开一个点以下代码无建树过程,因为初始差分值为 0const int N=1e5+5;...原创 2020-12-05 08:58:54 · 358 阅读 · 0 评论 -
洛谷 P3801 红色的幻想乡(线段树+容斥)
如果会二维线段树的话,这个题目应该会好想一点,但是数据范围不允许使用如果考虑一维线段树的话,只能考虑每次的贡献值其实不难发现,我们建两个线段树,分别维护 x 轴和 y 轴,这样对于每一次询问,只要找到 [x1,x2] 有几个标记的点(记为 x),[y1,y2] 有几个标记的点(记为 y)所以答案为,但是还差点,因为其所在的位置并没有红雾,而在计算横向有多少点和纵向有多少点时,都需要减去这个特殊点也就是减去,但是还有问题,这是一般情况,如果有两条直线重合呢?假设与 x 同向的...原创 2020-12-03 17:31:51 · 299 阅读 · 0 评论 -
洛谷 P6812 「MCOI-02」Ancestor 先辈(线段树+差分)
题意不大清楚,不过就是判断所给区间 [l,r] 是否是个单调递增(非严格)序列判断区间 [l,r] 是否是一个单调递增序列,可得任意一个数 a[i]-a[i-1]>=0 所以考虑差分设 d[i] 为 a[i] 的差分数组,所以题目转化成要判断 (l,r] 区间上的差分数组 d 的最小值大于 0而且题目涉及区间更新,所以用树状数组,但是树状数组我不会怎么更新区间最小值所以题目成了线段树裸题,分块也应该可以const int N=1e6+5; int i,...原创 2020-12-03 16:18:08 · 242 阅读 · 0 评论 -
洛谷 P6492 [COCI2010-2011#6] STEP(端点线段树)
其实这个题直接模拟即可,也算是要记住的一个模板了对于线段树维护的每一个区间,都有一个区间最值 maxx,左端点前缀,以及右端点后缀当更新一个点时,每次 push_up 都要做到从子节点转移到本节点,还要为其父节点的更新做铺垫所以对于任意一个节点 x 来说x 的左前缀是其左儿子的左前缀,x 的右后缀为其右儿子的右后缀,区间最值为其左右儿子的最大值但是当端点处更新时,我们要判断连接处是否更大,以及为父节点考虑如果 x 是父节点的左区间,那么判断 x 的左前缀是否要更新如果 ...原创 2020-12-03 15:18:20 · 366 阅读 · 0 评论 -
洛谷 P3611 [USACO17JAN]Cow Dance Show S(线段树+二分)
//#pragma GCC optimize(2)#include <bits/stdc++.h>#include <iostream>#include <cmath>#include <cstdio>#include <algorithm>#include <cstring>#include <queue>#include <vector>#include <utility>#.原创 2020-11-29 17:03:05 · 317 阅读 · 0 评论 -
洛谷 P2574 XOR的艺术(线段树)
const int N=2e5+5; int i,j,k; int n,m; int a[N]; struct Node { int l,r; int lazy; int sum; void update() { lazy^=1; sum=(r-l+1)-sum; } }t[N<<2];...原创 2020-11-28 11:16:50 · 231 阅读 · 0 评论 -
洛谷 P1637 三元上升子序列(权值线段树+离散化)
和求逆序对的题目差不多,还是按照桶排的思想,将线段树上的每一个点映射到对应位置,然后动态加点,统计每个数 a[j] 之前有多少个 a[i] 满足题目要求,将线段树清空后,再从后遍历一遍数组,寻找 满足 a[k] 的个数,根据乘法原理,两边求得的数相乘即可得到答案,当然对数据需要离散化才可以,用树状数组的话码量会小一点const int N=3e4+5; int i,j,k; int n,m,t; ll a[N]; vector <ll> v...原创 2020-11-27 19:31:46 · 499 阅读 · 0 评论 -
洛谷 P1774 最接近神的人(权值线段树+离散化)
根据贪心,每次都要交换两个逆序对,所以这个题目就是求逆序对的个数利用权值线段树来动态加点,每次询问找区间内 [id+1,n] 的所有数的个数,由于取值线段树本身具有顺序,所以可以将区间查询变为单点查询最后注意输出一定要 printf("%lld\n") ( 用 I64 错都不知道怎么错的)const int N=5e5+5; int i,j,k; int n,m,t; ll a[N]; struct Node { int l...原创 2020-11-26 13:18:07 · 405 阅读 · 1 评论 -
2020 ICPC Data Structure Problem(前缀和+线段树)
给出 2n 个数分别代表 a b 两个数组,题目要求维护数 c,c 是由 a,b 递推过来的题目的难点在于如何将单点修改转化到区间上来,我们可以枚举一下 ci 来寻找规律c1=max( a1,b1 ) c2=max( a2,max(b1+b2,a1+b2) ) c3=max( a3,max(a2+b3,max(b1+b2+b3,a1+b2+b3) ) ) 由此可以得出#define inf (1e18+1ll)const int N=2e5+5;...原创 2020-11-19 22:29:51 · 250 阅读 · 0 评论 -
Educational Codeforces Round 87 (Rated for Div. 2) D. Multiset(线段树)
输入 n,m ,代表有 n 个数,m 次更新输入 n 个数 ,将这 n 个数放入多重集合中,m 次更新,输入 kk<0 时,寻找序列中第 (-k) 个数,然后删除它 k>0 时,将值为 k 的数插入进去由于 a[] 数组的值 都不大于 n ,所有可以有桶排的思想得到,将每一个数映射到权值线段树上,当 k >0 时,直接插入,k<0 时,寻找第 (-k) 个元素,然后将权值减 1,但是这个题目内存卡的比较紧,线段树的节点包含的元素要尽量少con...原创 2020-11-03 23:23:54 · 165 阅读 · 0 评论 -
POJ 2528 Mayor‘s posters(线段树+离散化)
有 n 张海报,每张海报覆盖一段区间,后面的海报会覆盖前面的海报,求最后有多少张海报可以在墙上被看见(看见一点也算)const int N=1e5+5; int n,m,t; int i,j,k; //int a[N]; Pair p[N<<2]; vector<int> v; struct Node { int l,r; int flag;//被第几张海报覆盖 ...原创 2020-10-11 07:53:35 · 201 阅读 · 0 评论 -
A Simple Problem with Integers(区间修改+区间求和)
const int N=1e5+5; int n,m,t; int i,j,k; int a[N]; struct Node { int l, r; ll sum,lazy; void update(int x) { sum+=1ll*(r-l+1)*x; lazy+=x; } }node[N<<2]; ...原创 2020-09-29 22:32:02 · 303 阅读 · 0 评论 -
HDU 1698 Just a Hook(lazy)
const int N=1e5+5; int n,m,t; int i,j,k; //int a[N]; struct Node { int l,r; int lazy; void update(int x) { lazy=x; } }node[N<<2];void build(int l,int r,int id){ ...原创 2020-09-28 23:07:33 · 161 阅读 · 0 评论