线段树
酷酷的Herio
这个作者很懒,什么都没留下…
展开
-
[车和矩形](扫描线)
[车和矩形](扫描线)传送门思路显然矩形满足的充要条件是:每行或每列至少有个一个车。行,列等价,不妨只考虑行xxx。因此我们可以对矩形和车按照yyy排序,如果yyy相同,车放前面。然后遍历到矩形时,我们只需要查询[lx,rx][lx,rx][lx,rx]这个区间所有yyy的最小值是否都大于等于lylyly,如果满足说明[lx,rx][lx,rx][lx,rx]每行至少一个车。因此我们只需要一个数据结构,支持单点修改,区间查询最小值即可。显然是线段树,这里注意线段树储存的是每行(列)的最大值。原创 2021-11-06 10:33:37 · 212 阅读 · 0 评论 -
P1502 窗口的星星(扫描线)
P1502 窗口的星星(扫描线)给定矩形宽高,每个点有个点权,最大覆盖点券权和。显然扫描线。因为不包括边界,上右都减1.对每个点建立边权(x,y,y+h-1,l),(x+w-1,y,y+h-1,-l)然后对x排序,x相同优先大权,用线段树维护y。每次区间更新,维护答案即可。注意离散化。#include<bits/stdc++.h>using namespace std;typedef long long ll;typedef unsigned long long ull;原创 2021-11-04 20:42:32 · 193 阅读 · 0 评论 -
B - Beam Cannon(扫描线)
B - Beam Cannon (扫描线)求给定$w\times h $的矩形覆盖的最多的点数。经典扫描线。对一个点建立两条边,一条入边(x,y,y+h)权为1,一条出边(x+w,y,y+h)权为-1。然后用线段树维护y,每次查询整个区间的max即可。这里我们枚举的是矩形的右上角,显然对于一个点(x,y)(x,y)(x,y)。(x,y)(x,y)(x,y)到 (x+w,y+h)(x+w,y+h)(x+w,y+h)这个矩形的所有范围都可以作为右上角包括该点。而边的权就是控制xxx轴,线段树yyy原创 2021-11-04 17:18:55 · 241 阅读 · 0 评论 -
F. SUM and REPLACE(线段树&dsu)
F. SUM and REPLACE(线段树&dsu)与区间开平方是一个题型,区间变成d(i)d(i)d(i) 最多变666次。可以线段树维护区间和和区间最大值,当区间最大值≤2\le 2≤2直接返回不修改。然后就是裸的线段树。线段树代码#include<bits/stdc++.h>using namespace std;#define ll long longint n,m,i,j,k,t[1200005],a[300005],d[1000005];ll s[1200原创 2021-08-25 14:36:25 · 287 阅读 · 0 评论 -
线段树乱做GSS
线段树乱做GSSSP1043 GSS1区间最大子段和,显然可以线段树维护4个变量,左端点开始的答案,右端点结尾的答案,整个区间的答案,整个区间的和。答案参考题解区#include <iostream>#include <cstdio>#include <cstring>#include <string>#include <cmath>#define SIZE 50010#define lson p<<1,l,mid原创 2021-08-23 20:24:58 · 193 阅读 · 0 评论 -
P4340 [SHOI2016]随机序列(线段树)
P4340 [SHOI2016]随机序列(线段树)结论:只有前缀积有贡献。因为第一个数前面是没有符号的,除了前缀积外,都可以通过加号变成减号、减号变加号使其贡献抵消。接下来考虑每个前缀积的贡献。我们可以枚举前缀积的位置iii。记录前缀积为sis_isi,第iii个符号可以有两种选择+,−+,-+,−。然后其他符号任意选。所以一共有:2×3n−i−12\times 3^{n-i-1}2×3n−i−1然后总和就是:ans=∑i=1n−1si×2×3n−i−1+sn\large ans=\s原创 2021-08-18 17:44:47 · 299 阅读 · 0 评论 -
P1505 [国家集训队]旅游(树剖板题)
P1505 [国家集训队]旅游(树剖板题)1.边权转点权。dfs时边下放到点就行了,因为每个点的父边唯一。2.然后就是裸的线段树了,区间翻转,区间最值,单点修改,没了。3.码农题好想吐槽啊。// Problem: P1505 [国家集训队]旅游// Contest: Luogu// URL: https://www.luogu.com.cn/problem/P1505// Memory Limit: 256 MB// Time Limit: 1000 ms// Date: 2021-08原创 2021-08-18 13:11:12 · 288 阅读 · 0 评论 -
Man Down(线段树dp)
Man Down(线段树dp)是男人就下100层的模拟,因为每个平台往左和往右的状态是确定的,这可以通过线段树的区间覆盖,单点查询求,然后就是从高往低dp。时间复杂度:O(nlogn)O(nlogn)O(nlogn)区间覆盖不需要lazt taglazt \ taglazt tag,换句话说a[x].colora[x].colora[x].color 就是lazy taglazy \ taglazy tag#include<bits/stdc++.h原创 2021-08-12 20:59:48 · 422 阅读 · 0 评论 -
J. Journey to the “The World’s Start”(二分线段树dp)
J. Journey to the “The World’s Start”(二分线段树dp)显然卡的范围rrr是可以二分的,如果r1<r2r_1< r_2r1<r2 ,r1r_1r1 能满足显然r2r_2r2也能满足。然后考虑对于某个rrr,能否在ttt内到达nnn。这可以通过dp。显然由状态转移方程:dpi=max(dpj)+ti,j∈[i−r,i−1]dp_i=max(dp_j)+t_i ,j\in [i-r,i-1]dpi=max(dpj)+ti,j∈[i−r,原创 2021-08-12 18:24:04 · 266 阅读 · 0 评论 -
871F.MEX Queries(线段树)
871F.MEX Queries(线段树)区间覆盖为1,区间清0,区间0-1翻转。问最小0出现的位置。维护每个区间的1出现的最小位置,0出现的最小位置即可。// Problem: F. MEX Queries// Contest: Codeforces - Educational Codeforces Round 23// URL: https://codeforces.ml/problemset/problem/817/F// Memory Limit: 256 MB// Time Lim原创 2021-08-03 19:53:39 · 334 阅读 · 0 评论 -
ihoCoder 1831- 80 Days
HihoCoder 1831- 80 Daysai=ai−bi,ai+=ai−ai−1a_i=a_i-b_i,a_i+=a_i-a_{i-1}ai=ai−bi,ai+=ai−ai−1显然就是维护长度nnn的区间最小值≥−c\ge -c≥−c 。区间最小值可RMQ,线段树。此外本题队列也可做,把能到达加入队尾,否则弹出队首,队列长度到达nnn直接输出答案,因为保证了队列的连续性,所以正确性也是保证的。显然尺取也是对的。因此本题有四种方法:RMQ线段树队列尺取尺取的时空复杂原创 2021-07-31 10:46:04 · 226 阅读 · 0 评论 -
G. WiFi Password(线段树)
G. WiFi Password(线段树)容易发现可以尺取,然后需要 一个支持单点修改的数据结构,显然线段树可以。然后没了。// Problem: G. WiFi Password// Contest: Codeforces - 2017 ACM Jordanian Collegiate Programming Contest// URL: https://codeforces.ml/gym/101608/problem/G// Memory Limit: 256 MB// Time Limit原创 2021-07-31 10:24:55 · 235 阅读 · 0 评论 -
E. Pencils and Boxes(尺取&dp)
E. Pencils and Boxes(尺取&dp)显然按val排序,然后考虑dp,显然转移的jjj随iii增加不会递减,接着考虑限制条件,显然i往右走,要是差值小于d,i递增, 因为有k的限制。所以每次转移的时候是找一个区间是否可行,找区间是否有解可用BIT,线段树,ST等。初始化dp0=1dp_0=1dp0=1,所以BIT整体右移下即可。// Problem: E. Pencils and Boxes// Contest: Codeforces - Educational Code原创 2021-07-31 09:58:53 · 262 阅读 · 0 评论 -
E. Boring Segments(尺取&线段树)
E. Boring Segments(尺取&线段树)尺取+线段树将线段按valuevaluevalue排序,显然左指针右移,右指针不会左移。然后维护区间是否被覆盖(就是维个min)即可。// Problem: E. Boring Segments// Contest: Codeforces - Educational Codeforces Round 112 (Rated for Div. 2)// URL: https://codeforces.ml/contest/1555/prob原创 2021-07-31 09:02:41 · 400 阅读 · 0 评论 -
P1712 [NOI2016] 区间(线段树&尺取)
P1712 [NOI2016] 区间(线段树&尺取)考虑对区间长度排序,然后尺取做,显然当左端点右移时,要满足答案,右端点不可能左移。所以尺取是可行的,接下来是怎么统计一个点出现的次数,显然就是区间修改,单点查询。这不线段树裸题嘛,没了。code// Problem: P1712 [NOI2016] 区间// Contest: Luogu// URL: https://www.luogu.com.cn/problem/P1712// Memory Limit: 250 MB// Tim原创 2021-07-14 20:39:14 · 262 阅读 · 0 评论 -
P1438 无聊的数列(差分&线段树)
P1438 无聊的数列(差分&线段树)区间加上等差数列,可以利用等差数列的差分数组相同的性质来做。对于[L,R][L,R][L,R]加上一个等差数列。如:原始区间:[0,0,0,0,0,0][0,0,0,0,0,0][0,0,0,0,0,0]区间[1,5][1,5][1,5]加上[1,3,5,7,9,0][1,3,5,7,9,0][1,3,5,7,9,0][1,3,5,7,9,0][1,3,5,7,9,0][1,3,5,7,9,0]差分数组变为:[1,2,2,2,2,−9][1,2,2原创 2021-07-06 17:33:59 · 304 阅读 · 0 评论 -
P1186 玛丽卡(最短路&线段树&并查集)
P1186 玛丽卡(最短路&线段树&并查集)题意:无向连通带权图,删掉一条边后所有最短路的最大值。思路:显然先跑一遍最短路,然后记录最短路的边,非最短路的边无影响,依次删除最短路的边跑最短路,时间复杂度:O(nmlogn)O(nmlogn)O(nmlogn),会T。考虑如何优化。考虑强制用其他非最短路跑最短路,会替换掉最短路的哪些路径,将这些路径的贡献该为利用其他边跑最短路的最小值,这样就变成了一个区间修改问题。然后查找路径的话,可以利用并查集,将最短路上的路径的fa都标记为自己原创 2021-07-05 10:29:39 · 313 阅读 · 0 评论 -
P2590 [ZJOI2008]树的统计(树剖)
P2590 [ZJOI2008]树的统计(树剖)很裸,区间修改都不需要了,只需用到线段树的单点修改和区间查询。code// Problem: P2590 [ZJOI2008]树的统计// Contest: Luogu// URL: https://www.luogu.com.cn/problem/P2590// Memory Limit: 125 MB// Time Limit: 1000 ms// Date: 2021-04-02 11:41:50// --------by Herio-原创 2021-04-02 12:05:07 · 267 阅读 · 0 评论 -
Traveling Merchant(线段树)
Traveling Merchant(线段树)思路线段树好题,仔细读题后注意到只有777种情况,因为只要确定第一个数是星期几,后面所有的数都确定了,这是对于正向的情况,对于反向走的情况,因为题目的条件本身就是对称的,即1→71\rightarrow 71→7 等价于7→17\rightarrow 17→1,所以反向将l,rl,rl,r交换下,然后确定是第几种情况即可。最后就是开777个线段树维护区间最小,最大值,区间右最大值-左最小值,区间左最大值-右最小值即可。时间复杂度:O(nlogn)O(nl原创 2021-03-21 21:59:35 · 346 阅读 · 0 评论 -
C.Hotel(线段树&最大子段和维护)
C.Hotel(线段树&最大子段和维护)题意 区间更新,区间查询最小空区间的左端点。思路 类似最大字段和的分治维护,线段树维护333个变量ls,rs,sls,rs,sls,rs,s左端点最大子段和,右端点最大子段和区间最大字段和。区间查询时按照左,中,右的顺序满足最优性质。代码// Problem: Hotel// Contest: NowCoder// URL: https://ac.nowcoder.com/acm/contest/12156/C// Memory原创 2021-02-09 23:04:14 · 301 阅读 · 0 评论 -
最大子段和的两种解法
最大子段和的两种解法1.贪心和动态规划实质一样。前面和sumi−1<0sum_{i-1}<0sumi−1<0就丢掉,然后加上aia_iai,就是以aia_iai结尾的最大子段和。2.分治法。递归到l=rl=rl=r时,显然最大子段和是aia_iai。对于区间[l,r][l,r][l,r]我们需要维护4个变量。1.1.1.以lll为左端点的最大子段和lsumlsumlsum。2.以rrr为右端点的最大字段和rsumrsumrsum。3.[l,r][l,r][l,r]原创 2021-02-08 16:24:43 · 407 阅读 · 1 评论 -
A Simple Problem On A Tree(树链&线段树)
A Simple Problem On A Tree(树链&线段树)树形转序列,线段树维护区间修改,区间加,区间乘,区间求和。树形转序列就用树链部分,然后dfndfndfn序,然后线段树维护。更新时注意顺序。时间复杂度:O(nlog2n)O(nlog^2n)O(nlog2n)#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N=1e5+5,M=2e4+5,inf=0x3f3f原创 2020-12-09 17:57:36 · 312 阅读 · 0 评论 -
HDU5306 Gorgeous Sequence (jls线段树)
HDU5306 Gorgeous Sequence (jls线段树)3个操作:1.区间最值修改。2.区间求最值。3.区间求和。思路:开一个变量mx,semx,semx,se维护区间最大值和严格次大值,再开一个cntcntcnt,维护区间最大值的个数。时间复杂度:O((n+m)logn)O((n+m)logn)O((n+m)logn)#include<bits/stdc++.h>using namespace std;typedef long long ll;const int原创 2020-10-30 19:55:10 · 507 阅读 · 1 评论 -
F. Graph and Queries(反向并查集&dfs序&线段树)
F. Graph and Queries(反向并查集&dfs序&线段树)思路:反向并查集+dfs+dfs+dfs序+++线段树对询问进行离线操作,从后往前,最开始建立一张删除所有询问边后的图,然后倒着重构图,如果是操作一就更新查询结点为其祖先结点:Q[i].se=find(Q[i].se)Q[i].se=find(Q[i].se)Q[i].se=find(Q[i].se)如果是操作二就利用并查集建立新结点连边,具体就是新建立一个结点其儿子为这条边的两个结点,父亲也同时更新为该新结点。原创 2020-10-04 13:46:49 · 382 阅读 · 0 评论 -
hdu.6703 array
hdu.6703 arrayhdu.6703\ arrayhdu.6703 array思路:线段树。对操作2分析可知:ans∈[1,n+1]ans\in[1,n+1]ans∈[1,n+1]操作1相当于:将一个数变得很大就可以直接将a[pos]a[pos]a[pos]的下标置为n+1n+1n+1,因为此时a[pos]a[pos]a[pos]的值肯定满足大于等于kkk,而且原来的a[pos]≥ra[pos]\ge ra[pos]≥r就肯定能被取到。因此考虑建立权值线段树储存值,然后用原创 2020-09-14 23:08:24 · 299 阅读 · 0 评论 -
E. Painting the Fence(线段树)
E. Painting the Fence(线段树)思路:线段树的区间修改+单点询问。考虑:将lazylazylazy标记和colorcolorcolor用一个变量ccc表示,因为初始化ccc本身就是一种修改。然后就是用双端队列维护每个颜色对应的区间,每次修改的时候,找到一个满足条件的区间修改即可。不过貌似应该有更优的方法。#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N=3e5原创 2020-07-22 16:51:21 · 400 阅读 · 0 评论 -
Happy Triangle(动态开点线段树)
Happy Triangle(动态开点线段树)思路:动态开点线段树+mapmapmap维护集合。对于询问1,21,21,2的插入和删除操作用mapmapmap维护起来就行了。对于询问333,我们只需要找到a,ba,ba,b不妨设a≤ba\leq ba≤b,使得a,b,xa,b,xa,b,x组成三角形。显然若a,b,xa,b,xa,b,x能组成三角形,则b′,b,x,(b′∈(a,b])b',b,x,(b'\in(a,b])b′,b,x,(b′∈(a,b])也组成三角形。因为x∈(b−a,a+b),原创 2020-07-15 16:51:39 · 403 阅读 · 0 评论 -
线段树题目整理和总结
线段树题目整理前话:之前写的线段树的代码不够优雅,所以这次准备开个坑重新写下代码,可能会咕咕咕掉。1.P3372 【模板】线段树 1区间修改,区间求和。#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N=1e5+5,M=1e6+5,inf=0x3f3f3f3f,mod=1e9+7;#define mst(a) memset(a,0,sizeof a)#define lx x<原创 2020-07-11 14:38:18 · 351 阅读 · 0 评论 -
Yet Another Bracket Sequence(线段树&前缀和)
Yet Another Bracket Sequence(线段树&前缀和)传送门思路:线段树维护最小前缀和。令′(′'('′(′为1, ′)′')'′)′为−1-1−1。保证前nnn项和为0且前nnn项最小前缀和大于等于0即可。#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N=1e5+5;#define mst(a) memset(a,0,sizeof a)stru原创 2020-06-04 16:52:41 · 612 阅读 · 1 评论 -
小阳的贝壳(线段树&差分数组)
小阳的贝壳(线段树&差分数组)传送门思路:利用线段树和差分数组维护,对于区间修改,用差分数组即可实现,然后对于求区间内差分数组的最大值,用一个mxmxmx维护即可,然后对于询问区间的最大公因数,利用辗转相除法的结论:gcd(a,b)=gcd(a,b−a)gcd(a,b)=gcd(a,b-a)gcd(a,b)=gcd(a,b−a)gcd(al,al+1,al+2…ar)=gcd(al,gcd(al,al+1),gcd(al+1,al+2)…,gcd(ar−1,ar))=gcd(al,al+1−a原创 2020-05-27 16:47:31 · 404 阅读 · 0 评论 -
数列分块1(学习)
数列分块1(学习)题目传送门适用范围:区间修改,单点查询。思想:分块操作,将bk(block)bk(block)bk(block)个数作为一组(一块)。每次操作会涉及最多nbl\dfrac{n}{bl}bln个块和包括左右区间不完整最多2bl2bl2bl个 元素。即每次操作的复杂度大约在:O(nbl+bl)O(\dfrac{n}{bl}+bl)O(bln+bl)根据均值不等式→bl=n\rightarrow bl=\sqrt{n}→bl=n最合适。总复杂度:O(nn)O(n\sqrt{n原创 2020-05-18 20:37:54 · 318 阅读 · 0 评论 -
R - Transformation (线段树&lazy标记)
R - Transformation (线段树&lazy标记)思路:由于都是对区间进行修改和询问,所以可以用lazy标记该区间是否相等。若不相等总能分成若干个相等小的区间进行求和。具体看代码。AC代码:#include<cstdio>#include<cstring>using namespace std;const int N=8e6+5,mod=1e...原创 2020-04-26 09:36:07 · 382 阅读 · 0 评论 -
Q - Can you answer these queries? (线段树&区间开平方修改)
Q - Can you answer these queries? (线段树&区间开平方修改)思路:线段树模板改编,需要对update进行剪枝,因为一个数最多开平方到1就为止了,判断一下这个区间和是否等于该区间长度即可。还有需要注意一点得是x,y未知,若x>y,需要swap一下。。。。AC代码:#include<cstdio>#include<cstring...原创 2020-04-25 18:45:58 · 316 阅读 · 0 评论 -
P - Vases and Flowers (线段树&二分)
P - Vases and Flowers (线段树&二分)思路:给定n个花瓶,m个操作,1:从L开始插F朵花,给花瓶中花为0的插入花,插入到不能插入为止。2:区间求和,并清零。第二个操作简单,第一个操作要用到二分,查找最左端第一个插入花的位置和最后一个插入花位置。AC代码:#include<cstdio>#include<iostream>#inclu...原创 2020-04-25 10:38:24 · 347 阅读 · 0 评论 -
M - I Hate It (线段树&区间最值)
M - I Hate It (线段树&区间最值)思路:板子题。AC代码:#include<iostream>#include<cstdio>#include<algorithm>using namespace std;const int N=2e5+5;int tr[N*10];void re(int x){ tr[x]=max(tr...原创 2020-04-23 15:01:52 · 340 阅读 · 0 评论 -
L - 敌兵布阵 (线段树模板题)
L - 敌兵布阵 (线段树模板题)思路:板子题。AC代码:#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int MAX=50050;int t,N;int tr[MAX<<4];void re(int x){ tr...原创 2020-04-23 15:00:38 · 306 阅读 · 0 评论 -
T - A Simple Problem with Integers (线段树&区间修改)
T - A Simple Problem with Integers (线段树&区间修改)思路:线段树&lazy_tag板子题。AC代码:#include<iostream>#include<cstdio>#include<algorithm>using namespace std;const int N=1e5+5;typede...原创 2020-04-23 14:57:22 · 273 阅读 · 0 评论