线段树
文章平均质量分 67
线段树的题目
荼白777
这个作者很懒,什么都没留下…
展开
-
翻转括号序列(线段树 + 二分)
传送门题面思路操作一把括号改变我们令( = 1,) = -1,那不就是变成了区间乘以-1即可;查询最右边的合法’)’首先考虑最暴力的思路,就硬for,暴力查询[L,i][L,i][L,i]的和,看看是否为0,这肯定是TLE的;那么我们考虑优化;我们考虑维护一个前缀最小值lmn;然后用二分找区间[L,n][L,n][L,n]最后一个lmn >= 0的点r1;这样[L,r1][L,r1][L,r1]的lmn≥0,且是r1是最大的,且这里面可能存在解;我们是要找某个最大的点原创 2022-03-22 19:20:29 · 545 阅读 · 0 评论 -
权值线段树&树状数组实现求第k大&前驱&后继
题面思路这题其实是平衡树的板子…;用树状数组做需要离线离散化处理;首先增加删除一个数很容易,直接用树状数组的加一减一即可;如果要查询数值xxx的排名其实相当于问我们1到x-1有多少个数;那么query后加一即可;如果要查第kkk小的数,这个和往常的树状数组不同,要写一个新的函数;有两种理解方式,一种是类似倍增LCA的想法;另一种是反向求和;比如说我们要131313我们用二进制的思想去拼凑他,13=8+4+113=8+4+113=8+4+1核心思想就是找到一个小于它但是最大原创 2021-10-06 23:22:16 · 677 阅读 · 0 评论 -
简易版第k大——权值线段树模板&树状数组第k大
第k大思路每个节点表示数值,而不是表示区间Code#include <iostream>#include <cstdio>#include <algorithm>#include <vector>using namespace std;typedef long long ll;const int N = 1e6 + 10;int n,q,a[N];#define lc (p<<1)#define rc (p&原创 2021-10-05 18:45:46 · 115 阅读 · 0 评论 -
L题 Euler Function ——线段树区间乘,单点修改
题面2021ICPC网络赛第二场思路首先关于欧拉函数的性质具体实现用bitsetbitsetbitset维护100内的所有质数;如果当前要乘的www的全部质因子都被包含了;那么我们就可以直接乘,也就是线段树裸的区间乘;如果没有被包含,那么我们就交给子树来处理;如果处理到叶子了还没被包含,那么直接暴力单点修改;Code#include <iostream>#include <bitset>#include <vector>using na原创 2021-09-27 10:12:52 · 120 阅读 · 0 评论 -
A.Busiest Computing Nodes
题目思路使用线段树单点修改,区间查询;参考了这篇博客的思路;但是不知道为什么我的代码跑的巨快,只用50+ms思路就是拿一个vector数组来存结束的时间;因为这个时间是比较大的,因此我们需要离散化处理一下;遍历每一个事件的时候;将时间1到event[i].arr1到event[i].arr1到event[i].arr内的vector数组中的计算机释放出来;查询的时候,先判断有无空闲节点;如果没有直接抛弃;否则先查询[idx,k][idx,k][idx,k],如果查不到空闲的;原创 2021-09-21 18:04:25 · 232 阅读 · 1 评论 -
线段树叶子节点代表线段
前言在往常的题目中,线段树的叶子节点是代表一个点的情况;而我这次遇到了一个题目,需要维护线段之间的关系;因此我们将线段树的每个节点都看成一个线段;思路我们定义线段树的某个节点维护区间[L,R][L,R][L,R],表示从L到R+1的一条线段L到R+1的一条线段L到R+1的一条线段;比如线段树节点维护区间[3,3][3,3][3,3]表示从点3持续到点4的一条线段;例题2021ICPC网络赛D题题意就是给我们若干个三元组[L,R,W][L,R,W][L,R,W],表示覆盖区间[L,R]原创 2021-09-20 15:58:50 · 135 阅读 · 0 评论 -
亚特兰蒂斯——线段树扫描线
题面Code#include <iostream>#include <vector>#include <algorithm>#define lc (p<<1)#define rc (p<<1|1)using namespace std;const int N = 10000+10;int n;vector<double> lsy;//离散ystruct Line{ double x,y1,y2原创 2021-09-18 17:31:35 · 116 阅读 · 0 评论 -
区间最大公约数
题目题面要求两个操作区间加求区间的最大公约数结论gcd(a1,a2,...,an)=gcd(a1,b2,...,bn)gcd(a_1,a_2,...,a_n) = gcd(a_1,b_2,...,b_n)gcd(a1,a2,...,an)=gcd(a1,b2,...,bn)b1=a1,bi=ai−ai−1,i≥2b_1=a_1,b_i=a_i-a_{i-1},i≥2b1=a1,bi=ai−ai−1,i≥2bbb是aaa的差分数组思路因为要求区间的一个最大公约数;原创 2021-09-11 17:11:05 · 146 阅读 · 0 评论 -
E - Non-Decreasing Dilemma
题目要求两个操作将某点a[x]改成u,即单点修改求[L,R][L,R][L,R]的子数组个数分析这题没有涉及区间修改,因此我们不需要push_down;我们假设子数组的个数为sub很容易想到tr[p].sub = tr[lc].sub + tr[rc].sub那么除了这些还有别的吗?如果当前节点的左子树 可以一直不降到 右子树假设左子树右边的不降长度为tr[lc].rlen,右子树左边的不降长度为tr[rc].llen那么我们每次从左子树取长度为一接到右子树的不降长度上,根节点原创 2021-09-11 16:29:21 · 281 阅读 · 2 评论 -
2053: Peach Conference
题目来源题面思路一、将清空操作视为区间最小值操作不知道区间操作点我#include <iostream> #define lc (p<<1)#define rc (p<<1|1) using namespace std; const int N = 1e5+10; typedef long long ll;struct Node{ int l,r,mx,sec_mx,mx_num; int mx_tag,other_tag原创 2021-09-08 23:01:43 · 169 阅读 · 0 评论 -
线段树的区间最值操作与区间历史最值
前提知识基本的线段树写法:洛谷线段树1洛谷线段树2以下是正文一、区间最值操作例题一、Gorgeous Sequence本题要求我们实现三个操作对于第二种和第三种操作我们是已经知道如何写了。问题就在于第一种操作。考虑第一种操作是取min因此当我们这个区间内的最大值 1.如果比给定的k来得小 那么我们不需要任何操作2.如果这个k<最大值 但是k > 第二大的值(以下称为次大值)那么我们只需要将最大值全部变成k,修改一下区间和即可.3.如果这个k<最大值 &原创 2020-12-24 19:54:54 · 1187 阅读 · 3 评论 -
线段树解决区间计算问题
问题一、POJ3264这一题只涉及了查询线段树的最大值&最小值Code#include <iostream>#include <utility>#define lc (p<<1)#define rc (p<<1|1)using namespace std;const int N = 5e4+10;struct Node{ int l,r; int maxn; int minn;}tree[N<&l原创 2021-04-21 19:28:08 · 189 阅读 · 0 评论