线段树
lahlah_
沉浸 尊重
展开
-
CF765F Souvenirs
https://www.luogu.com.cn/problem/CF765F 挺不错的一道题,首先考虑扫描线,对于每个iii,找j<i,a[j]>a[i],jj<i,a[j]>a[i], jj<i,a[j]>a[i],j最大的 用权值线段树可以轻易维护 假设找到一个jjj,然后再找(a[i],a[j])(a[i],a[j])(a[i],a[j])之间的 时间复杂度不优 考虑再找到的一个是j′j'j′ 发现必须要满足a[j′]−a[i]<a[j]−a[i]a[j']原创 2022-02-18 19:20:51 · 373 阅读 · 0 评论 -
P7530 [USACO21OPEN] United Cows of Farmer John P
https://www.luogu.com.cn/problem/P7530 按照套路,我们记pre[i]pre[i]pre[i]表示上一个和iii相同颜色的位置 考虑扫描线,记f[l]f[l]f[l]为每个左端点的答案,用线段树维护就是区间(pre[r],r−1)(pre[r],r-1)(pre[r],r−1)的f[l]f[l]f[l]和 考虑i∈[l,r],pre[i]i\in[l,r],pre[i]i∈[l,r],pre[i]显然能作为左端点,把它当系数设为0,假设iii是中间点,那么它可以把(pre原创 2021-12-22 08:05:11 · 138 阅读 · 0 评论 -
CF1110F Nearest Leaf
https://www.luogu.com.cn/problem/CF1110F 考虑先把问题离线下来, 用线段树维护当前点到所有叶子的最近距离 如果uuu进入一颗子树vvv,那么就把vvv对应的区间全部−1-1−1,区间外的全部+1+1+1 于是线段树维护区间+−1+-1+−1即可 #include<bits/stdc++.h> #define N 500050 #define ll long long #define ls (rt << 1) #define rs (rt <原创 2021-12-04 08:09:13 · 112 阅读 · 0 评论 -
CF1286D LCC
https://www.luogu.com.cn/problem/CF1286D 经典套路题 首先碰撞的一定是相邻两个,然后要么是相遇,要么是追及, 首先把所有可能相遇的情况拿出来,按照发生时间排个序 然后考虑当前情况iii发生的概率,即前i−1i-1i−1个都没有发生 可以用前iii个没有发生的概率−-−前i−1i-1i−1个没有发生的概率得到 对于强制每个相遇不发生,即它的方向被限制了 考虑动态DP维护 即f[rt][0/1][0/1]f[rt][0/1][0/1]f[rt][0/1][0/1]表示rt原创 2021-10-29 08:48:22 · 131 阅读 · 0 评论 -
luogu P7476 「C.E.L.U-02」苦涩
https://www.luogu.com.cn/problem/P7476 考虑树套树,每个节点维护一个大根堆 然后如果要删掉为堆顶,如果被包含在删除的区间内,那么直接删掉即可 否则把这个值下放到儿子区间,再继续修改 代码实现不难 code: #include<bits/stdc++.h> #define N 200050 #define ls (rt << 1) #define rs (rt << 1 | 1) using namespace std; int mx原创 2021-10-12 21:05:56 · 111 阅读 · 0 评论 -
CF338E Optimize!
https://www.luogu.com.cn/problem/CF338E 转换一手 令b[i]=h−b[i]b[i]=h-b[i]b[i]=h−b[i],那么条件完美匹配条件变为排序后a[i]>b[i]a[i]>b[i]a[i]>b[i],容易证明这是充要的 转换到这一步还是不太好做 考虑离散化后把b[i]b[i]b[i]设为−1-1−1,a[i]a[i]a[i]设为111, 维护权值的前缀和,那么就要保证每个前缀和都>=0>=0>=0,这个可以用线段树轻松实现 代原创 2021-10-11 07:44:42 · 311 阅读 · 0 评论 -
luogu P6109 [Ynoi2009] rprmq
https://www.luogu.com.cn/problem/P6109 矩阵加,矩阵求最大值 一看就不太阳间 考虑对于一个询问矩阵,按照x从中间分开,另外一维差分,往左右两边分别跑一次历史最值线段树就是答案 然后就秒了 发现可以离线 然后就可以先对于x轴做一个猫树分治,然后把询问和修改挂在分治点(中间点)上,大力对于每个中间点往左往右跑历史最值线段树即可 有一些细节要注意,对于一个位置,必须先减后加,不然会得到非法的值 O(nlog2n+qlogn)O(nlog^2n+qlogn)O(nlog2n+q原创 2021-08-26 14:33:28 · 212 阅读 · 0 评论 -
luogu P5471 [NOI2019] 弹跳
https://www.luogu.com.cn/problem/P5471 一眼树套树,但是发现空间会炸 于是采用空间一个log的线段树套set 然而发现如果连边的话空间还是会炸 发现可以不用连边,考虑dijkstra 把二维结构维护出来,然后每次查询一个矩阵,把矩阵里的点全部便利一边 因为一个点最多被出队一次,所以时间复杂度是对的 log2log^2log2 code: #include<bits/stdc++.h> #define N 70050 #define pi pair<in原创 2021-07-23 18:18:50 · 110 阅读 · 0 评论 -
CF526F Pudding Monsters
https://www.luogu.com.cn/problem/CF526F 对于一个坐标(x,y)(x,y)(x,y)令a[x]=ya[x]=ya[x]=y于是问题就变成了 经典的连续段计数问题 没有重复的元素 所以对于一个区间如果满足max−min+1=lenmax-min+1=lenmax−min+1=len 那就是成立的(充要条件) 变一下式子 max−min−len=−1max-min-len=-1max−min−len=−1 可以用那线段树+单调队列维护对于以当前点为右端点的所有区间的最大值-原创 2021-03-21 19:34:53 · 246 阅读 · 0 评论 -
[luogu P6144] [USACO20FEB]Help Yourself P
我丢: https://www.luogu.com.cn/problem/P6144 先考虑 k = 1 考虑DP 首先将所有的线段按照左端点排序,考虑 f[r]f[r]f[r]表示最右以rrr结尾的线段集合的连通块的数量的和. 插入一个线段[l,r][l,r][l,r], 对于右端点在[1,l−1]的每种情况,都可以使它们的连通块加1,再加到f[r]里面对于右端点在[1,l-1]的每种情况,都可以使它们的连通块加1,再加到f[r]里面对于右端点在[1,l−1]的每种情况,都可以使它们的连通块加1,再加到f原创 2020-05-22 13:37:06 · 238 阅读 · 0 评论 -
luogu P2221 [HAOI2012]高速公路
这种思博题有什么好写的呀 直接考虑每条边的贡献,然后把贡献的式子拆开,再维护一下就好了 思博题 code: #include<bits/stdc++.h> #define N 200005 #define int long long using namespace std; int gcd(int x, int y) { return y? gcd(y, x % y) : x; } ...原创 2019-12-12 08:32:55 · 176 阅读 · 0 评论 -
浅谈线段树合并
一句话,就是信息合并 code: int merge(int x, int y){ if(!x) return y; if(!y) return x; ch[x][0] = merge(ch[x][0], ch[y][0]); //合并左儿子 ch[x][1] = merge(ch[x][1], ch[y][1]); //合并右儿子 size[x] = size[ch[x][0]] + ...原创 2019-07-19 18:23:26 · 95 阅读 · 0 评论 -
CF558E A Simple Task
题目大意: 给定一个长度不超过10^5的字符串(小写英文字母),和不超过50000个操作。 每个操作 L R K 表示给区间[L,R]的字符串排序,K=1为升序,K=0为降序。 最后输出最终的字符串。 我扔:https://www.luogu.org/problemnew/show/CF558E 这题我们只需建26颗线段树维护区间覆盖,然后每次操作就把字母区间内的字母从小到大先提出来再插进...原创 2018-11-03 21:20:23 · 315 阅读 · 0 评论 -
noip 2017 列队 (45行!!!!)
题目的话,我扔 https://www.luogu.org/problemnew/show/P3960 这题在仔细思考(看题解)后感觉还是挺简单的。 因为对于每一次操作只会影响当前行和最后一列,那么我们可以用动态开点线段树来维护每一行的前m - 1 个然后在用一个维护最后一列,那么就可以很愉快的A了。 代码(45行有木有!!!!) #include<bits/stdc++.h>...原创 2018-10-01 11:13:18 · 371 阅读 · 0 评论