数据结构----线段树/树状数组/ST表
#
夕林山寸
这个作者很懒,什么都没留下…
展开
-
CF1436 E. Complicated Computations MEX性质分析+权值线段树维护区间种类
思维量比较大的一道题,如果之前做过类似的就很简单,但没做过的话真的有点难想。。首先一个比较容易想到的点:从1枚举到n+1,用某种方法计算最终的MEX序列是否出现i。对于一个子数组[L,R],若其MEX等于x,则其必须满足:区间内不包含x,且区间内包含所有1 - x-1的数。关键点在于这里如何进行维护。我们可以这样做:对于区间不好含x这个限制我们可以每次取区间:(lst[a[i]],i),这样区间一定不包含a[i],而包含1 - x-1的数可以考虑用权值线段树维护:从左往右..原创 2020-11-04 22:15:40 · 252 阅读 · 0 评论 -
Educational Codeforces Round 96 (Rated for Div. 2) A-E
(353) xxx 5 187 +00:05 +00:10 +100:28 +00:53 +01:21 A:倒着枚举就行,复杂度是够的,不要纯On^2就行。。#include <bits/stdc++.h>using namespace std;typedef long long ll;#define re register#define ls (o<<1)#define r...原创 2020-10-11 20:19:02 · 504 阅读 · 0 评论 -
2019 ICPC Asia Nanjing Regional F. Paper Grading 字典树上的dfs序上建立树状数组套权值线段树
这题的关键思路点:把n个串插入到字典树上后,对于一个串t,与其前缀k个相同的在字典树的字符串为: 从根节点沿着t走k步后到达的节点tk,其子树节点满足这个条件。然后自然而然就能想到字典树上dfs序建立主席树,求l-r字符串中,符合条件的字符串个数。(主席树的经典操作了,求[l,r]范围内值为x-y,的数的个数。)即建立n棵树,每棵树i,的位置j,维护的是:1-i字符串中,dfs序为j的字符串的个数。由于要支持修改操作,我们可以用树状数组套权值线段树:具体操作见代码:(写了个空间回收.原创 2020-10-07 16:15:47 · 184 阅读 · 0 评论 -
Codeforces Round #675 (Div. 2) 1442 F - Boring Queries 可持久化线段树维护 区间乘法
#include <bits/stdc++.h>using namespace std;typedef long long ll;#define re register#define pb push_backtypedef pair<int,int> pii;const double PI= acos(-1.0);const int M = 2e5+7;const int mod = 1e9+7;struct node{ int l,r,id,ans;}...原创 2020-10-06 21:57:16 · 918 阅读 · 0 评论 -
【模板】可持久化线段树 2(主席树) 主席树模板
大半年没用过主席树了,手敲回顾下,20min手敲1A主席树模板。。我感觉我线段树这一块拿捏的死死的!!很easy#include <bits/stdc++.h>using namespace std;typedef long long ll;const int M = 2e5+7;int a[M],li[M],cnt=0;int rt[M*20],ls[M*20],rs[M*20],tr[M*20];void up(int pre,int &o,int l,in原创 2020-10-04 21:25:32 · 176 阅读 · 1 评论 -
2020牛客暑期多校训练营(第四场)A Ancient Distance 二分 + 调和级数优化 +线段树维护
#include <bits/stdc++.h>using namespace std;typedef long long ll;#define re register#define ls (o<<1)#define rs (o<<1|1)#define m (l+r)/2#define pb push_backconst double PI= acos(-1.0);const int M = 2e5+7;int head[M],cnt=1;...原创 2020-09-27 15:44:39 · 145 阅读 · 0 评论 -
ACL Beginner Contest
A - Repeat ACL 模拟就行B - Integer Preference判不相交即可C - Connect Cities连通块个数-1就是结果#include <bits/stdc++.h>using namespace std;typedef long long ll;#define re register#define ls (o<<1)#define rs (o<<1|1)#define pb push_back...原创 2020-09-27 09:58:54 · 426 阅读 · 0 评论 -
codeforces 1418 G. Three Occurrences 区间非法状态维护 + 线段树维护区间最小值和最小值的个数
这类找区间个数题,一般可以枚举一个端点,找符合条件的另一个端点的个数。这题我们枚举右端点,对每个数x而言,其作为右端点的时候,满足条件的左端点必须是其前面2个x与前面3个x之间的点。我们用lst[i][j],当前状态下,从后往前第j个i的位置。显然:对于每个值i,都有:在区间[lst[i][3]+1 - lst[i][2]] 合法,其余点做为左端点均不合法。由此有了做法:从左往右枚举右端点,对于每个值,当前状态下,某个点可以作为左端点,则其值+1,否则不变。显然,只有满足点值为0的点原创 2020-09-17 19:04:24 · 445 阅读 · 0 评论 -
2020牛客暑期多校训练营(第二场)H Happy Triangle 线段树维护相邻两个元素的差
思路比较简单,这题主要考验码力。显然:分情况讨论:1: a<b<x 时, ab尽量大2:a<x<b时,a尽量大,b尽量小3: x<a<b时, b-a尽量小1.2直接用set维护即可。3用线段树维护,每次单点更新最多修改线段树2个点的值。主要是细节问题。具体看代码。#include <bits/stdc++.h>using namespace std;#define ls (o<<1)#define r..原创 2020-09-03 19:36:32 · 135 阅读 · 0 评论 -
算法竞赛——进阶指南——acwing353. 雨天的尾巴 树上差分+动态开点线段树 +线段树合并
每个点开一个权值线段树(表示每个点每个种类的个数),x-y加上z种类,相当于让x-y区间的z种类+1。在树上就是 x的z种类+1,y的z种类+1,lca(x,y)的z种类-1,fa[lca(x,y)]的z种类-1.上述操作用动态开店权值线段树维护单点更新即可。每次最多更新4棵线段树。每棵线段树最多增加logz个节点 。总共会产生4mlogz个节点所以时空复杂度都是4mlogz最后dfs求子树和时,用线段树合并即可。如标题算法合并的模板题。三个算法都弄熟练这题就能手敲出来了。...原创 2020-06-02 22:33:14 · 179 阅读 · 0 评论 -
“科大讯飞杯”第十七届同济大学程序设计预选赛暨高校网络友谊赛 H时空栈 线段树
线段树维护区间加,区间最右边第一个小于x的数。先说下正解:开一个以时间为节点的线段树,每个节点维护的值为当前时间点栈内元素个数。遇到入栈,让t,sz 的值加1,出栈:让t,sz的值减1.碰到查询操作,先查询当前时间点的栈的元素个数nm,再查找[1,t]区间最右边的小于nm的时间点ans。ans+1即最后一次入栈。(可以仔细想一下为什么)上述操作用线段树处理即可。区间加,单点查询。和查询最右边小于x的数。我刚开始的思路是二分+线段树,每个节点维护的是每个时间点的操作,.原创 2020-05-15 11:36:19 · 177 阅读 · 0 评论 -
CodeForces_1348EF - Phoenix and Memory 贪心+线段树找区间最小值
这题如果没有输出2个解就很简单。是个之前做过的类型:把所有限制按R排序,然后每次取出R最小的,然后从其L开始选,尽量选能选的中最小的。这样选如果能选完,就说明有解。贪心正确性显然:R大的至少可以选则R做为点来用。所以按R升序遍历,每次优先选左边的,能让后边的可选的更多。用set维护可选的数即可。这题加了个输出2个方案。我们考虑最简单的情况:即确定一个序列后,是否有2...原创 2020-05-03 11:09:21 · 413 阅读 · 0 评论 -
UCF Local Programming Contest 2018 E. Cupcake Bonuses dfs序上跑2棵线段树
题解给的暴力,。,一脸怀疑。。。估计数据没有造极限。。下面说下正解:像这种区间处理子树,带修改带查询,一看就是dfs序上跑线段树我们建一颗sm线段树,维护每个员工的S,初始都为0,等员工加进来的时候,给他赋值为S。1操作:加员工 up函数2操作:修改每个员工的S值,单点在sm树上修改,up函数3操作:让一颗子树的所有S乘上B,把所得的值存在另一颗ans线段树上,ans线段树...原创 2020-03-26 17:32:16 · 359 阅读 · 0 评论 -
POJ 3321 dfs序+树状数组简单题
简单题,回顾dfs序,方便学dfs序+RMQ 求CA#include <cstdio>#include<cstring>#include<iostream>using namespace std;typedef long long ll;#define ls (o<<1)#define rs (o<<1|1)#def...原创 2020-03-19 20:48:01 · 110 阅读 · 0 评论 -
CF895 E - Eyes Closed 线段树维护乘法和加法
如果时暴力做的话:对l1,r1区间内的数,每个数有1/(r1-l1+1)的概率被替换,被替换成的数的期望为sum(l2,r2)/(r2-l2+1) 所以l1,r1区间内一个数 a[x]=1/(r1-l1+1)*sum(l2,r2)/(r2-l2+1) +(r1-l1)/(r1-l1+1) * a[x];化简为: a[x]= a[x]*k + b;k,b是常数。然后用线段树...原创 2020-02-11 22:42:33 · 160 阅读 · 0 评论 -
[ZOJ-2112] 树状数组套权值线段树 非常卡空间。。。
空间给的贼小。线段树套权值线段树就不用想了树状数组套权值线段树也会MLE。因为空间是6e4*log(6e4)*log(5e4)刚好卡掉。。我们必须用树状数组维护改变的值:因为输入数组有5e5个,我们单独开5e5个可持久化线段树维护,空间是5e4*log(6e4)然后询问就照常开,空间:1e4*log(6e4)*log(5e4)总空间:1e4*log(6e4)*log...原创 2020-02-09 20:34:57 · 219 阅读 · 0 评论 -
动态第K大 线段树套权值线段树 / 树状数组套权值线段树
下面两个程序已经对拍 放心食用树状数组套权值线段树#include<cstdio>#include<cstring>#include<algorithm>#include<vector>using namespace std;const int maxn=2e6+5;int rt[maxn*2],ls[maxn*20],rs[...原创 2020-02-09 13:14:30 · 278 阅读 · 1 评论 -
2019牛客暑期多校训练营(第二场)A,B,D,E,F,H,J
以后每周打牛客重现赛F. Partition problem递归组合数枚举。先把所有人当成红队,再组合数枚举7个人移到白队,每次移动改变的竞争值可以在On的复杂度内算出。#include <bits/stdc++.h>using namespace std;typedef long long ll;//typedef __int128 LL;//typedef...原创 2019-12-09 15:27:44 · 368 阅读 · 0 评论 -
CodeForces - 1252K 线段树维护矩阵乘法
本质上A操作相当于 * =.B操作相当于:*=.区间修改,区间查询,明显的线段树操作。我们每个节点同时维护和,区间更新时只需要交换两个矩阵即可,比较方便。#include <bits/stdc++.h>using namespace std;typedef long long ll;#define ls (o<<1)#define rs (...原创 2019-12-11 10:17:22 · 440 阅读 · 0 评论 -
Codeforces Round #555 (Div. 3)E. Minimum Array 线段树写法
思路比较简单,就是优先让C数组左边的数更小,令now = n-a[i].那么 b尽量等于now,如果没有b等于now就找第一个大于now的数,还没有的话就找1-now之间最小的数。上述操作用线段树、mulset、并查集都可以维护。//Codeforces Round #555 (Div. 3)E. Minimum Array#include <bits/stdc++....原创 2019-11-01 18:16:12 · 128 阅读 · 0 评论 -
HDU - 4614
比较简单,一发A。这几个操作很明显线段树维护。初是区间都是0,代表某个区间花数量和2 a b 把区间赋值成0,查询区间和。1 a f查询 a - n-1 区间无花数量是否小于f 小于的花直接全部插上花,插之前询问最左边无花,最右边无花的瓶子位置即最小值最右边//最左 的坐标。如果区间无花数量大于f。则二分查找区间无花数量第一个大于等于f的位置。刚好这个区间插满花,右边为p...原创 2019-09-03 20:01:24 · 276 阅读 · 0 评论 -
HDU - 4578
加inline 快200ms 2000ms。这一题 就是一个序列,4种操作,区间加,乘,赋值。然后询问区间和,平方和,立方和。更新了正解:。。花了6小时。这种方法复杂度稳定nlogn。直接把3种操作打3个标记,三个输出维护3种数组。add,mul,ass输出很简单。关键怎么维护。先说更新标记。来了一个3操作,覆盖。既然要将x-y区间覆盖成p。那...原创 2019-09-02 20:50:29 · 371 阅读 · 0 评论 -
HDU - 3974
仔细想一下就发现就是dfs序上建线段树进行维护。。建出这棵树的dfs序。(上下级关系)每个节点掌控的区间为这个节点所在的子树(包括自己),由于是dfs,同一子树的结点的dfs序一定是连续的,即dfs序连续区间。修改一个点,会把他的所有子孙所在结点全部赋值成一个值。就变成了dfs序的区间更新。查询一个点,就直接查询这个点的dfs序就行。//KX#include <bit...原创 2019-09-02 17:14:18 · 371 阅读 · 0 评论 -
POJ - 3468 树状数组 区间查询区间更新 模板
You haveNintegers,A1,A2, ... ,AN. You need to deal with two kinds of operations. One type of operation is to add some given number to each number in a given interval. The other is to ask for the ...原创 2019-04-16 11:06:26 · 202 阅读 · 0 评论 -
Educational Codeforces Round 72 (Rated for Div. 2) A--E
RANK:1868 1702 -13→1689最近cf打的太差了。感觉还是前面题不稳。导致难题没时间想,简单题又不快。。排名自然很低A:先把智力点到比力量高1以上。点不到 就输出-1;然后要分奇偶当c是偶数时,有c+1种分配,其中 c/2,c/2是零界点。智力c/2以上,都是可行的。再考虑c/2一下,每少点一点智力,智力和力量差多2.所以要看智力比...原创 2019-09-06 18:25:18 · 119 阅读 · 0 评论 -
CodeForces - 371D 线段树+二分
线段树+二分水题。。线段树维护第i个容器还能装多少水倒水d到第x容器,先判断水是否会流到地上,流到,就把所有容器的容量赋值0.否则,二分找到,x---pos 容量和第一个大于d的容器。把x --- pos-1 的容器容量赋值0,第pos个容器的水量为x---pos区间和减去d。所以容量为tmp-水量即可。查询就单点查询。注意tg可能为0.//KX#include &l...原创 2019-09-09 20:15:05 · 212 阅读 · 1 评论 -
动态开点 线段树 POJ - 3468
按着POJ3468 题敲得。一直没写过动态开点,虽然知道咋写,但还是练习一下,以防以后强制在线。//KX#include<cstdio>#include<cstring>using namespace std;template<typename T>inline void rd(T&x) { x=0; int f=1; c...原创 2019-09-10 22:44:53 · 120 阅读 · 0 评论 -
Gym - 101630A - Archery Tournament 动态开点线段树
动态开点,注意细节。把加入靶子想象成加入线段,在这个线段上所有点都标记上这个靶子。即线段树结点用set维护下区间被 set中靶子完全覆盖。再判断是否在靶子上即可,//KX#include <bits/stdc++.h>using namespace std;const int M = 2e5+7;int cnt,z,id;////打中靶子的id struc...原创 2019-09-11 00:27:53 · 138 阅读 · 0 评论 -
线段树 --- 思路(口胡专栏)
CodeForces - 1093G:Multidimensional Queries (线段树求K维最远点距离)POJ2926.做完这题后。就知道怎么求K维最远距离。带修改很容易想到线段树。首先,k维 。我们把1<<k 这么多种状态,每种建立一颗线段树。每个结点对应每个点维护当前状态的值。(二维其中一个状态: + - 那第i个点 的值就是 xi-yi)然...原创 2019-09-20 23:02:56 · 143 阅读 · 0 评论 -
The Preliminary Contest for ICPC Asia Nanjing 2019 A,F 线段树/树状数组
过了4题,校74我写了A。A:首先蛇形填数要处理好。这是一个思维问题。根据坐标确定在第几圈,方向,第几个。然后就转化为了M个点,询问P个子矩形里的元素和。然后这个问题就可以用二维偏序进行处理。(自行百度,就是利用树状数组/CDQ求M个点中每个点,横纵坐标均小于这个点的其他点的权值和)但这个是一个子矩形,我们很容易想到把子矩形拆成4个点,就行二维前缀和一样处理即可。然后处...原创 2019-09-02 14:42:01 · 159 阅读 · 0 评论 -
hdu1540 线段树维护左右第一个0的位置
线段树维护村庄状态。1表示未摧毁0表示摧毁。问最大连续村庄,只需要求左右最近摧毁村庄位置相减即可。//包括自身的村庄以上过程也可以用set进行维护,即:set存被摧毁村庄id。用二分快速查找。//KX#include <bits/stdc++.h>using namespace std;typedef long long ll;typedef double...原创 2019-09-01 10:18:39 · 305 阅读 · 0 评论 -
SPOJ - DQUERY 区间种类查询
离线做法:枚举右端点R,右端点固定时,记录最右边第一次出现的数字为1,比如1 2 1 2 3,0 0 1 1 1 .给定L,那么L-R区间数字种类的结果是:sum[R]-sum[L-1].把询问按R从小到大排序,我们R+1时,维护的数组只改变R+1为1,和R+1的数之前出现的位置变为0即可。区间种类 查询 主席树在线做法:把上述过程在线,即每个R建一棵线段树就行。/...原创 2019-09-01 09:32:23 · 176 阅读 · 0 评论 -
kuangbin 线段树 R - DNA Sorting POJ - 1007 逆序对(树状数组)
R - DNA Sorting虽然题目数据很小 (可以暴力O 4nm)但我就非要复杂化这一题 用树状数组做。。。。(复杂度强行无限扩大O nmlogn。。强行符合这一专题。。)#include<vector>#include<iostream>#include<cstdio>#include<algorithm>#includ...原创 2019-05-28 19:17:49 · 129 阅读 · 0 评论 -
[kuangbin带你飞]专题七 线段树N - Picture POJ - 1177 扫描线求周长
N - PicturePOJ - 1177扫描线求周长。刚学完求面积 然后不会这一题。。求周长其实和面积差不多POJ 1177 Picture (线段树+离散化+扫描线) 详解这篇博客讲的不错通常有2中方法。1.横向扫一遍 求竖线和,然后纵向求横线和2.只扫一遍 记录每段扫描线中间的缺口数量,没缺一个 横向边要多2个。懒得写题解了 看看刚才那...原创 2019-05-30 21:18:14 · 178 阅读 · 0 评论 -
普通平衡树 HYSBZ - 3224 ---权值线段树写法
您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3. 查询x数的排名(若有多个相同的数,因输出最小的排名)4. 查询排名为x的数5. 求x的前驱(前驱定义为小于x,且最大的数)6. 求x的后继(后继定义为大于x,且最小的数)Input第一行为n,表示操作的个数,下面n行每行有两个数opt和...原创 2019-04-30 22:36:12 · 245 阅读 · 0 评论 -
[kuangbin带你飞]专题七 线段树 B - I Hate It HDU - 1754 单点更新求最大值
很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。这让很多学生很反感。不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。Input本题目包含多组测试,请处理到文件结束。在每个测试的第一行,有两个正整数 N 和 M ( 0<N<=200000,0<M<5...原创 2019-04-28 23:34:31 · 125 阅读 · 0 评论 -
4301 Can you answer on these queries III 0x40「数据结构进阶」例题 区间查询单点更新 最大子段和
描述给定长度为N的数列A,以及M条指令 (N≤500000, M≤100000),每条指令可能是以下两种之一:“2x y”,把 A[x] 改成 y。“1x y”,查询区间 [x,y] 中的最大连续子段和,即 max(x≤l≤r≤y) { ∑(i=l~r) A[i] }。对于每个询问,输出一个整数表示答案。输入格式第一行两个整数N,M第二行N个整数Ai接下来M行每行3...原创 2019-04-24 01:21:48 · 206 阅读 · 0 评论 -
4302 Interval GCD 0x40「数据结构进阶」例题
思路比较中肯,就是代码实现的时候 要注意的点很多。卡了我2天 3个多小时。首先这道题是要区间加 并且区间gcdgcd满足区间操作 很容易想到线段树维护。可是题目是区间修改 lazy标记不能更新区间gcd。我们要把区间修改利用差分数组的思想改成单点修改就行。更新区间x,y的时候我们只需让x这个点+d,y+1这个点-d,那么这个区间的差分就求出来了。又由于...原创 2019-04-25 22:18:37 · 178 阅读 · 0 评论 -
B - Stars POJ - 2352
Astronomers often examine star maps where stars are represented by points on a plane and each star has Cartesian coordinates. Let the level of a star be an amount of the stars that are not higher and ...原创 2019-04-15 21:58:08 · 239 阅读 · 0 评论 -
A - Ultra-QuickSort POJ - 2299 树状数组+离散化 求逆序对
In this problem, you have to analyze a particular sorting algorithm. The algorithm processes a sequence of n distinct integers by swapping two adjacent sequence elements until the sequence is sorted i...原创 2019-04-15 20:11:40 · 182 阅读 · 0 评论