线段树
FSYo
我不去想是否能够成功,
既然选择了远方,
便只顾风雨兼程
展开
-
【CTSC2017】游戏(贝叶斯公式)(线段树)
传送门考虑 iii 为 1 的概率更前后第一个确定的游戏有关,即 iii 为 1 的概率为P(xi=1∣xl=a,xr=b)=P(xi=1,xl=a,xr=b)P(xl=a,xr=b)=P(xi=1,xr=b∣xl=a)P(xl=a)P(xr=b∣xl=a)P(xl=a)=P(xi=1,xr=b∣xl=a)P(xr=b∣xl=a)P(x_i=1|x_l=a,x_r=b)=\frac{P(x_i=1,x_l=a,x_r=b)}{P(x_l=a,x_r=b)}\\=\frac{P(x_i=1,x_r=b|原创 2020-06-21 17:29:11 · 279 阅读 · 0 评论 -
【题目泛做】学军信友队欢乐赛 E (线段树)(凸包)(单调栈)
神题考虑维护上界和下界,下界是个区间求和上界是个阶梯状的(前缀 maxmaxmax 和 后缀 maxmaxmax)假设询问全部是 [1,n][1,n][1,n],那么我们预处理一个点在 [li,ri][l_i,r_i][li,ri] 的时间内作为前缀最大值然后按时间排序,插入当前作为最大值的点,线段树维护这个单调栈的贡献现在需要解决区间是 [l,r][l,r][l,r] ...原创 2020-04-06 00:25:43 · 301 阅读 · 0 评论 -
「JOISC 2020 Day1」扫除 (分治)(线段树)(平衡树)
传送门首先考虑 Subtask 3Subtask\ 3Subtask 3,这些点是单调的,所以用线段树维护区间赋值Subtask 4Subtask\ 4Subtask 4,没有插入,考虑如果一个点被推到一个地方,那么它与其它的相对顺序就不会变,所以我们用动态开点线段树来找点,用一个平衡树来维护被推的点,平衡树支持插入,区间赋值对于有插入的情...原创 2020-03-25 23:54:36 · 418 阅读 · 0 评论 -
Comet OJ - Contest #16 小 C 的可重集 (随机二分)(线段树)
传送门秀儿操作!我们每次随一个区间,考虑求出 ≥\ge≥ 它的区间个数注意到左端点固定区间大小随右端点递增,于是 ≥\ge≥ 一个区间的是一个前缀如果个数 ≥k\ge k≥k 那么可以给每一个左端点的区间钦定一个上界,否则可以钦定一个下界这样的期望次数是 logn\log nlogn 的,相当于每次 banbanban 掉一部分于是问题变成了对于给定区间,对每一个左端点求前缀的终止位...原创 2020-03-15 09:26:05 · 217 阅读 · 0 评论 -
「ZJOI2017」字符串 (Hash)(分块)(线段树)
LOJLOJLOJ 传送门题解:我们考虑用线段树维护最小后缀的出现位置,那么需要考虑如何合并两个区间发现最小后缀可能是前面区间的某一个后缀加上后面的一整个字符串,注意这个某一个后缀并不一定是前面区间的最小后缀,于是我们需要维护可能后缀的集合。定义:一个 iii 的 “kkk-后缀” 指的是字符串 S[i...k]S[i...k]S[i...k](以下用 SiS_iSi 表示),一个 i...原创 2020-02-15 19:29:58 · 415 阅读 · 0 评论 -
【省选模拟】矩阵求和(斯特林数)(组合数转下降幂)(ZKW线段树)
HereHereHere给你一个 n×mn×mn×m 的矩阵,行列从 1 开始标号,第 i 行 j 列的值是 (i−1)∗m+j(i−1)∗m+j(i−1)∗m+j现在要求你实现以下操作。交换两行。交换两列。求一个子矩阵的做 k 次前缀和之后的和,对 1e9+71e9+71e9+7取模k≤10,n,m,q≤1e5k\le 10,n,m,q\le 1e5k≤10,n,m,q≤1e5...原创 2020-02-06 00:18:55 · 375 阅读 · 0 评论 -
CSP-S 模拟 19/11/09 小 X 的二叉树(启发式分裂)(扫描线)
题意:给一棵二叉树的中序遍历,问你能不能构造出一棵二叉树它的权值 ≤k\le k≤k权值 val=max(∣au−av∣)(u∈subtree(v))val=max(|a_u-a_v|)(u\in subtree(v))val=max(∣au−av∣)(u∈subtree(v))有一种策略是考虑当前处理的区间 [l,r][l,r][l,r]选择一个合法的点 xxx 作为根,合法的定义为...原创 2019-11-09 16:54:45 · 240 阅读 · 0 评论 -
省选模拟 19/11/05
黑白划分 最后答案的个数就是非纯色正方形的个数考虑容斥,用总的减去纯色的发现对每一个纯色的都要减去它覆盖的四个的贡献,而这样减正好能减完,令 f(i)f(i)f(i) 表示边长为 2i2^i2i 的个数ans=∑i=0n(2n−i)2−4∗f(i)∗[i>0]ans=\sum_{i=0}^n(2^{n-i})^2-4*f(i)*[i>0]ans=i=0∑n(2n−i)2−4∗...原创 2019-11-06 07:35:24 · 142 阅读 · 0 评论 -
染色[树链剖分][线段树合并]
题目描述 输入格式: 输出格式:对于每个询问操作,输出一行答案。输入样例#1: 6 52 2 1 2 1 11 21 32 42 52 6Q 3 5C 2 1 1Q 3 5C 5 1 2Q 3 5输出样例#1: 312分析树链剖分--> 将一棵树划分成几个区间,怎么算颜色个数呢线段树的val表示区间的颜色段...原创 2018-10-15 21:13:15 · 234 阅读 · 0 评论 -
近期刷题总结[2019 03 09]
目录寻找段落[分数规划+单调队列]P4319 变化的道路[LCT + 线段树分治]P2485 [SDOI2011]计算器[exgcd, bsgs] [模板]P4458 [BJOI2018]链上二次求和[线段树][二次前缀和]严格次小生成树[最小生成树+倍增]P2120 [ZJOI2007]仓库建设[斜率优化板子]P2155 [SDOI2008]沙拉公主的困惑...原创 2019-03-09 23:39:58 · 276 阅读 · 0 评论 -
近期刷题总结 [19 03 24]
目录CF14D Two Paths[树的直径]P3174 [HAOI2009]毛毛虫[树的直径]P2312 解方程[秦九韶算法]CF888D Almost Identity Permutations[ DP ]CF888G Xor-MST[0/1 trie]CF863D Yet Another Array Queries Problem[ splay 模板 ]...原创 2019-03-24 10:20:52 · 571 阅读 · 0 评论 -
CF438D The Child and Sequence [线段树+均摊分析]
传送门如果一个数取模了有变换, 那么它至少缩小一半, 所以最多 log 次就变成1了于是线段树记录区间最大, 如果最大的小于x, 就不用修改了, 否则暴力递归到底修改#include<bits/stdc++.h>#define N 200050using namespace std;typedef long long ll;int read(){ int x; s...原创 2019-07-09 23:26:57 · 214 阅读 · 0 评论 -
CF914D Bash and a Tough Math Puzzle [线段树]
传送门如果区间的gcd不是x的倍数, 就暴力向下找, 如果个数 > 1, 就可以不用找了, 并且输出 NO这样最多向下找两次, 复杂度是正确的#include<bits/stdc++.h>#define N 500050using namespace std;int read(){ int x; scanf("%d", &x); return x;}...原创 2019-07-10 16:59:02 · 128 阅读 · 0 评论 -
[PKUWC2018] Minimax [概率DP]
传送门考虑向上合并 !考虑一个数, 合并上去是它的概率 ----它到当前点本身的概率 p * ( 另一棵子树比它小的概率和 * 选大的概率 +另一棵子树比它大的概率和 * 选小的概率 )想到了线段树合并, 每个节点表示选当前区间的概率的和, 边往下走边统计和也就是 , 最后乘到 i 上面去怎么统计呢 ? 我们记x这颗线段树的贡献为 sx, y这颗的为 sy, 现在合并...原创 2019-07-15 10:42:58 · 160 阅读 · 0 评论 -
CF1093G Multidimensional Queries [线段树]
传送门类似套路, 将绝对值拆开我们设置一个状态S, 如果第i为是1, 就加上a[i], 否则为-a[i]那么一个合法的组合就是 val[S] + val[31-S], 于是在线段树中选两个最大的点加起来更新答案就可以了#include<bits/stdc++.h>#define N 200050using namespace std;const int inf ...原创 2019-07-11 17:51:04 · 214 阅读 · 0 评论 -
CF1009F Dominant Indices [线段树合并]
传送门, 听说可以长链剖分,但是不会啊!因为我们要维护每个点子树为 dep 的个数,考虑线段树合并,将子树的dep信息合并到父亲所以以dep为下标建立线段树,然后线段树维护区间最大值,也就是查dep出现次数最多的点#include<bits/stdc++.h>#define N 1000050using namespace std;int first[N], n...原创 2019-07-19 16:35:25 · 218 阅读 · 0 评论 -
[九省联考2018]IIIDX [线段树]
传送门发现可以建出一棵树,给树分配权值,祖先比子孙的权值小,且让整棵树按标号输出权值最大有一个比较容易想到的贪心 ----考虑一个点 u,它的大小 为 siz[u],我们每次从能够选择的权值中挑 siz[u] 个最大的,并将最后一个赋给 u这样做在权值没有重复的时候是对的,但有重复就会 GG因为兄弟可以跟它的子树里面的点换,仍然满足题意,但兄弟变大,也就是答案更优举个例子,...原创 2019-07-24 23:30:03 · 146 阅读 · 0 评论 -
NOIP模拟19/07/22
字符处理[题目描述]妈妈的工作是英语翻译,经常和英语字符串打交道,今天妈妈给了 Tom 一个只有小写字 母构成的字符串,需要 Tom 做以下工作:要是连续出现相同的小写字母,则把他们替换成这个字母的大写形式,后面紧跟相同字 母的个数,并把它之前跟之后的两段字串调换,例如出现 bcaaaaaaef,则新字符串变成: efA6bc,然后重新扫描字串,直到没有出现连续相同的小写字母为止。...原创 2019-07-22 15:33:50 · 376 阅读 · 0 评论 -
P3285 [SCOI2014]方伯伯的OJ [线段树+动态开点]
传送门跟NOIP2017有点像由于n<=10^8 , 我们不能记录每个数的位置, 于是我们可以开一棵权值线段树, 记录序列中取走的位置同时, 还要维护前后两头... 很明显也要用一种数据结构, 我们先来看看要干什么操作1: 将x的编号变成y, 并输出x的排名对于第一个, 我们可以开两个map, 一个记录y原来是x变来的, x现在已经变成y了对于第二个, 我们讨论...原创 2019-03-02 22:54:09 · 164 阅读 · 0 评论 -
bzoj3333[排队计划] [线段树]
首先观察一下每次修改后对答案的影响我们不妨令f[i]表示i 与i-n形成的逆序对个数每次提出来的数的逆序对贡献变成0, 没有提出来的数逆序对个数不变因为每次提出来的大于等于一个数的都会在它的后面, 而没有提出来的后面该有多少还有多少因此我们每次暴力找到x-n f[i]不为0且权值比a[x]小的并修改, 因为每个数最多修改一次,所以均摊是nlogn#include<bit...原创 2019-02-27 21:00:02 · 229 阅读 · 0 评论 -
P3521 [POI2011]ROT-Tree Rotations [权值线段树合并]
传送门我们发现交换两个子树, 两个子树内部是不会变的, 于是贪心考虑该子树换不换于是我们建权值线段树, 不换的话逆序对就是左儿子的权值线段树的右儿子 * 右儿子的权值线段树的左儿子, 换了相反于是我们边统计边合并两颗权值线段树大致过程 [蒟蒻第一次学权值线段树合并] 代码大概是这样void Merge(int &x,int y){// 将y合并到x上 ...原创 2019-01-31 11:46:03 · 237 阅读 · 0 评论 -
Hotel[线段树区间合并]
传送门题意:1 a:询问是不是有连续长度为a的空房间,有的话住进最左边2 a b:将[a,a+b-1]的房间清空原文:https://blog.csdn.net/fallen_fall/article/details/12974071 查询的时候要能直接获取区间的最大连续空房间,这样就能判断能不能连续放下这x个人,但这样还确定不了具体放哪。放的位置有三种情况1.放在左儿子那个区...原创 2018-11-06 22:15:56 · 159 阅读 · 0 评论 -
天天爱跑步[lca][dfs序][线段树动态开点]
传送门大家都写的差分,我太菜了看不懂啊与是这成了我练习暴力数据结构的好机会...我们发现,当往上走时,一个点对答案有贡献, dep[s] - dep[x] = time[x]往下走 dep[t] - dep[x] = len - time[x]于是我想,把dep在一层的放在一起,建一棵树那怎么提取区间呢其实区间就是 st[u] -- ed[u] (dfs序)然后动态...原创 2018-10-30 22:18:24 · 195 阅读 · 0 评论 -
列队[线段树]
题目分析线段树动态开点维护n+1棵线段树,第n+1棵表示最后一行 对于不在最后一行的操作查询第n棵线段树上的区间第k大,然后删掉,再将对应的第n+1线段树上的点删掉插入到后面的点用一个vector来记录 对于操作在最后一行的,直接删除,再插入到vector就可以了把删除一个点看做插入一个点,求第k大时减一下就可以了因为最多插入k次,所以空间时间都是O(k...原创 2018-10-23 22:09:41 · 181 阅读 · 0 评论 -
K大数查询[整体二分][线段树]
题目描述有N个位置,M个操作。操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是多少。输入格式:第一行N,M接下来M行,每行形如1 a b c或2 a b c输出格式:输出每个询问的结果输入样例#1: 2 51 1 2 11 1 2 22 1...原创 2018-10-21 16:58:17 · 234 阅读 · 0 评论 -
线段树维护最大字段和
题意: 维护数据结构,支持区间赋值,查询区间最大字段和线段树我们一个点存4个值L_Max 表示从左端点开始的最大字段和R_Max 表示从右端点开始的最大字段和Max 表示区间的最大字段和val 表示区间和考虑如何更新我们发现对于任何一个节点的Max, 要么全取右子树,要么全取左子树,要么一个取一点L_Max 要么还是取右子树,要么取右子树全部,再加上左子树的L_...原创 2018-10-09 20:21:44 · 610 阅读 · 0 评论 -
树上操作[DFS序][线段树]
题目描述有一棵点数为 N 的树,以点 1 为根,且树点有边权。然后有 M 个操作,分为三种:操作 1 :把某个节点 x 的点权增加 a 。操作 2 :把某个节点 x 为根的子树中所有点的点权都增加 a 。操作 3 :询问某个节点 x 到根的路径中所有点的点权和。输入格式:第一行包含两个整数 N, M 。表示点数和操作数。接下来一行 N 个整数,表示树中节点的初始权值。接下来...原创 2018-10-14 20:13:05 · 362 阅读 · 0 评论 -
理解扫描线
求覆盖的面积?我们将图竖着切成几段该段的面积就是这条线的长度*到下一段的距离我们把每一条边给定一个属性,这个矩形的左面边定义为入边,给一个+1的值,右边的边定义为出边,给一个-1的值我们维护当前有多少个点的值是大于0的什么意思 第一次 a[3]=a[4]=a[5]=1 面积2*1=2第二次a[5]=1 a[4]=2 a[3]=2 a[2]=1 a[1]=1 ...原创 2018-09-29 21:02:37 · 3468 阅读 · 11 评论 -
线段树(加法与乘法的lazy标记)
struct Node{int l,r,add,mul;}tree[N];开始在想,加了又乘又加,乘法又优先,怎么搞现在先理清几点1.add,mul是指现在算了,儿子没算的2.mul只记儿子要乘的,如果先加在乘,直接把add*val就行了举个例子一个区间1 4 3 2 全部 +1 , *2 ,+1首先 tree[1].add+=1,mul不变其次 tr...原创 2018-08-19 20:56:41 · 1003 阅读 · 0 评论 -
Work[线段树][二分答案]
分析开始也想到二分,但是无法判断哪些天数比它大,比它小排序啊,人按浪费的时间排序,题按时间排序,下标加入线段树#include<bits/stdc++.h>#define N 200005#define LL long long using namespace std;int m,n,ans[N],Mid,cnt[N*4];//时间总和 个数总和 LL...原创 2018-08-28 23:11:47 · 320 阅读 · 0 评论 -
Cleaning Shifts[线段树+DP]
传送门区间覆盖问题 , f[x]表示覆盖L--x的最少代价线段树维护区间最小//未ac但对拍过的代码#include<cstdio>#include<algorithm>#define N 10050#define M 100050#define LL long long #define inf 1000000000000000using n...原创 2018-11-18 21:27:32 · 190 阅读 · 0 评论 -
XOR的艺术[线段树]
传送门全部异或1 就是区间值变为区间长度-当前值 , 打一个tag就好#include<bits/stdc++.h>#define N 200050#define len (t[x].r-t[x].l+1)#define Llen (t[x<<1].r-t[x<<1].l+1)#define Rlen (t[x<<1|1].r-t[...原创 2018-11-23 21:43:55 · 176 阅读 · 0 评论 -
P4145 花神游历各国 [并查集+树状数组 / 线段树]
传送门法1: 发现根号开几次就没了, 于是可以并查集动态维护区间的一段1, 遇到区间一段就直接跳到下一个不为1的地方如果不是1就树状数组暴力单修法2: 线段树维护区间最大, 如果最大<=1 就直接跳过, 否则递归修改儿子树状数组+并查集#include<bits/stdc++.h>#define N 100050#define LL long long...原创 2019-01-30 11:01:58 · 201 阅读 · 0 评论 -
线段树扩展
最大字段和 / 最长0/1长度维护lMax,rMax,Max,val,区间合并就可以了区间修改,区间gcd我们令a的差分数组b,b[i] = a[i] - a[i-1]于是线段树维护b,每次区间加差分数组都不变,只需要单点修改b[l-1], b[r] 就可以了区间开方,单点修改,区间求和我们发现一个点开几次就开完了,于是我们维护区间Max如果Max=1我们就可以不用...原创 2019-01-27 11:04:10 · 206 阅读 · 0 评论 -
Interval GCD [树状数组+线段树]
传送门题解原网 ---- gsj 巨神学长 https://blog.csdn.net/forever_dreams/article/details/85222870#include<bits/stdc++.h>#define N 500051#define LL long longusing namespace std;struct Node{int l,r;...原创 2018-12-30 23:04:37 · 280 阅读 · 0 评论 -
P1471 方差 [ 线段树]
传送门方差拆开线段树维护区间和 , 区间平方和 , 修改时平方差一下就可以了#include<bits/stdc++.h>#define N 100050#define len(x) (t[x].r-t[x].l+1)using namespace std;struct Node{int l,r; double v1,v2,tag;}t[N<<2]...原创 2018-12-19 23:10:23 · 174 阅读 · 0 评论 -
P4198 楼房重建 [线段树] [最长上升子序列]
传送门 题解原网 #include<bits/stdc++.h>#define N 400050using namespace std;int n,m,val[N]; double Max[N];int Count(int x,int l,int r,double lim){ if(l>=r) return Max[x] > lim; int ...原创 2018-12-13 22:44:59 · 283 阅读 · 0 评论 -
[TJOI2009]开关 [线段树水题]
传送门全开就是将区间值变为区间长度减区间值#include<bits/stdc++.h>#define N 100050using namespace std;int n,m,tag[N<<2],val[N<<2];void Pushup(int x){val[x] = val[x<<1] + val[x<<1|1];}...原创 2018-12-13 21:04:05 · 168 阅读 · 0 评论 -
高速公路[线段树]
传送门 #include<bits/stdc++.h>#define N 100050#define LL long long#define len(x) (t[x].r-t[x].l+1)using namespace std;struct Node{LL l,r,tag,sum1,sum2,sum3;}t[N<<2];LL n,m; char ...原创 2018-12-02 11:58:55 · 216 阅读 · 0 评论 -
Flower[hdu4325][线段树][离散化]
传送门离散化 线段树区间修改+单点查询就可以了#include<cstdio>#include<cstring>#include<algorithm>#include<string>#define N 100050using namespace std;int s[N],t[N],b[N<<2],a[N],n,m,T...原创 2018-11-24 22:00:17 · 163 阅读 · 0 评论