
线段树
st
gongyuandaye
不要再问我会不会写可持久化非确定状态AC自动分块维护线段平衡仙人掌优化最小费用最大流预处理混合图上莫比乌斯反演莫队带花舞蹈链并查集树状数组套主席树预处理动态DP分治FFT求多项式逆元对数函数的指数函数用可持久化并查集合并最小费用循环流上插头DP了。
展开
-
2020牛客多校六 J. Josephus Transform (线段树求约瑟夫变换+置换群的幂)
题意:给出一个长度为 n 的排列,初始序列为 1 , 2 , 3 … , n。有 m 次操作,每次操作表示为 ( k , x ) ,即进行 x 次 k-约瑟夫变换(一次k变换表示取出的顺序),求最终排列。题解:线段树求约瑟夫变换+置换群的幂参考的大佬博客对于每一次操作,我们只要求出一次k-约瑟夫变换,x次的话就是该置换的x次幂,O(n)求一下即可。如何求一次的k-约瑟夫变换呢?pos = (pos - 1 + k - 1) % cnt + 1; 求得取出元素在剩余序列的位置,然后在线段树中查询,查询原创 2020-07-31 23:41:22 · 259 阅读 · 0 评论 -
HDU 1255 覆盖的面积 (线段树+扫描线+离散化)
题意:给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积。题解:线段树+扫描线+离散化有一道题跟这差不多,不过比这简单,是求总的面积,只要记录覆盖1次及以上的长度len即可。这题因为要求多次覆盖的面积,所以我们得新增一个变量len2来维护被覆盖两次及以上的区域长度,考虑4种情况:①cnt>1,被覆盖两次及以上长度就是区间长度。②叶子节点,为0。③cnt=1,区间被完全覆盖了1次,而有没有被完全覆盖两次或以上则无法确定,只要加上只要加上左右子结点的len,看看左右孩子区间被覆盖了一原创 2020-07-09 12:46:59 · 242 阅读 · 0 评论 -
HDU 2871 Memory Control (线段树+区间合并+成段更新+二分)
题意:给N个单位内存(编号从1开始),有4种操作。(1)“Reset”,表示把所有的内存清空,然后输出"Reset Now"。(2)“New x”,表示申请一块长度为x的内存块(如多解,左边优先),然后输出"New at A",A表示该内存块的起点。(3)“Free x”,表示把包含第x块单位内存的内存块清除,然后输出"Free from A to B",A和B分别表示该内存块的起点和终点。(4)“Get x”,表示返回第x块内存块的起始内存单位编号,然后输出 “Get at A”。题解:线段树+原创 2020-07-08 20:08:50 · 209 阅读 · 0 评论 -
HDU 3397 Sequence operation (线段树+区间合并+成段更新+多种操作)
题意:有N个为0或为1的数,有M个操作,操作有5种类型。(1)“0 a b”,表示将区间[a,b]范围内的数全部置0。(2)“1 a b”,表示将区间[a,b]内的数全部置1。(3)“2 a b”,表示将区间[a,b]内的数0变成1,1变成0。(4)“3 a b”,表示查询[a,b]范围内1的数。(5)“4 a b”,表示查询[a,b]范围内最长的连续的1。题解:线段树+区间合并+成段更新从昨天晚上wa到今天中午,终于a了。说明一下变量。sumsumsum:记录连续数字1。lsumlsumlsum:原创 2020-07-08 12:42:28 · 197 阅读 · 0 评论 -
HDU 3308 LCIS (线段树+区间合并+单点更新)
题意:给你N个整数,有两种操作,(1)“U A B”,表示把第A个数变成B,“Q A B”,表示查询区间[A,B]的最长连续上升序列。题解:线段树+区间合并+单点更新因为是连续的序列,基本的区间合并,具体操作内容可以看这篇。有一点变动就是要求上升,我们只要判断左右子树临界点m,若x[m] < x[m + 1],那么就表示两个区间可以合并。hdoj一直提交失败,过了样例,应该是正确的。#define _CRT_SECURE_NO_WARNINGS#include<iostream>原创 2020-07-07 20:36:08 · 165 阅读 · 0 评论 -
POJ 3667 Hotel (线段树+区间合并+成段更新)
题意:有N个房间,M次操作。有两种操作(1)“1 a”,表示找到连续的长度为a的空房间,如果有多解,优先左边的,即表示入住,输出左端点。(2)“2 b len”,把起点为b长度的len的房间清空,即退房。题解:线段树+区间合并+成段更新第一道区间合并的题。sumsumsum:区间中最长连续子区间。lsumlsumlsum:区间中从左端点开始的连续区间。rsumrsumrsum:区间中从右端点开始的连续区间。区间合并主要是PushUp()中的操作://取左子树、右子树、左右子树共同构成的连续区间原创 2020-07-07 19:30:44 · 214 阅读 · 0 评论 -
POJ 1177 & HDU 1828 Picture(扫描线+线段树+离散化)
题意:给出n个矩形,求最终图形的总周长。题解:扫描线+线段树+离散化我们从下至上扫描,离散化横坐标。我们每加一个边,累加边长的变化值,然后用线段树维护竖线的个数,具体见代码注释。还有就是重边的情况,两个oj的数据里都没有重边的数据,我们只要对于在同一h的边排序的时候,将入边先排即可,这样就可以减去重边。#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<cstdio>#include<string&原创 2020-07-06 22:08:02 · 193 阅读 · 0 评论 -
POJ 1151 & HDU 1542 Atlantis (扫描线+线段树+离散化)
题意:n个矩形,给出左下、右上坐标,求最后总的面积。题解:扫描线+线段树+离散化第一道扫描线。我们从下至上扫描,离散化横坐标。扫描之前还需要做一个工作,就是保存好所有矩形的上下边,并且按照它们所处的高度进行排序,另外如果是上边就是-1,相当于总区间上删除一段,也就是出边;下边给就是1,相当于往总区间上插入一段,也就是入边。我们每次往线段树里加一条入边,也就是在不断更新总的底边长度(增加或减少),直到下一条边是出边,那么我们可以累加面积。如何判断下一条边是出边呢?由于我们记录了每条边的高度,用e[原创 2020-07-06 20:23:14 · 191 阅读 · 0 评论 -
CodeForces 343D Water Tree (树链剖分+线段树)
题意:一棵树有N个节点,有三种操作(1)“1 v",表示将以点v为根节点的子树全部赋值为1,(2)“2 v”,表示将点v以及点v的所有祖先节点全部赋值为0,(3)“3 v”,表示查询点v的值。题解:树链剖分+线段树操作1:通过dfs序确定节点位置,然后用线段树成段更新。操作2:树链剖分,更新自己及祖先。操作3:线段树单点查询。#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<cstdio>#includ原创 2020-07-06 16:25:16 · 242 阅读 · 0 评论 -
HDU 4747 Mex (线段树+成段更新+找位置)
题意:给你N个数,枚举所有的L和R,问由区间[L,R]之间的数构成的集合里,哪一个非负数字没有出现,如果有多个,找出最早的一个,设其为Mex[L,R],求所有Mex的和。题解:线段树+成段更新我们先预处理【1,i】的所有Mex的值。首先明确一点,在iii往后的过程中,Mex的值是非递减的,我们用vis[]vis[]vis[]记录一下数是否出现过即可。然后将这些值存进线段树中。接下来我们只要将左端点一个个删去即可,也就是线段树的查询区间左端点右移,假如当前我们要删除a[i]a[i]a[i],我们先找原创 2020-07-05 19:42:14 · 179 阅读 · 0 评论 -
HDU 4614 Vases and Flowers (线段树+成段更新+找位置)
题意:有N个花瓶(标号为0~ N-1)。操作1:当她收到F朵花时,她会随机的选择一个瓶子A,从它开始遍历A,A+1, A+2, …, N-1号瓶子,遇到空瓶子就放一朵花进去,直到花朵放完或没有瓶子,剩下的花将被丢弃,输出放的起点和终点。操作2:清理标号从A到B的花瓶(A <= B),花瓶里的花会被丢弃,输出丢弃的花数量。题解:线段树+成段更新+找位置我们用1表示空瓶子,0表示放了花。操作2很好做,就是区间查询,再用区间大小减去空瓶子数量,就是花的数量。然后进行区间更新。对于操作1,由于我们要找原创 2020-07-05 16:12:05 · 244 阅读 · 0 评论 -
(待改)HDU 4578 Transformation (线段树+成段更新+多种操作)
题意:给你一个数组,初始值为零,有四种操作(1)“1 x y c”,代表 把区间 [x,y] 上的值全部加c(2)“2 x y c”,代表 把区间 [x,y] 上的值全部乘以c(3)“3 x y c” 代表 把区间 [x,y]上的值全部赋值为c(4)“4 x y p” 代表 求区间 [x,y] 上值的p次方和1<=p<=3题解:线段树+成段更新+多种操作wa了一天,实在找不到哪里有问题,1次方答案是对的,但往上就错了。等刷完成段更新的其他题再看看吧。#define _CRT_SE原创 2020-07-04 20:41:45 · 156 阅读 · 0 评论 -
POJ 2528 Mayor‘s posters (线段树+成段更新+离散化)
题意:有t组测试数据,有n张海报,海报按题目给出的顺序覆盖并给出左右区间,问最后能看到几张海报,不完整也算。题解:线段树+成段更新+离散化由于题目区间大小有1e7,直接用线段树去做很可能t了,考虑离散化。我们发现若区间为【1,5】,中间2、3、4其实是没有用处的,所以对于题目给出的区间,我们提取左右端点放入新的数组中,然后去重,这就是离散化。但是有一个小问题,对于区间【1,3】【5,7】【2,6】,若按照上述方法去做,答案是2,实际我们知道答案是3,因为上述做法将中间的4给忽略了,这里我们只要对于新原创 2020-07-03 17:32:52 · 199 阅读 · 0 评论 -
POJ 3468 A Simple Problem with Integers (线段树+成段更新)
题意:给你N个数,然后有M个操作。有两种类型的操作,(1)“C a b c”,表示将区间[a,b]里的数加上c。(2)“Q a b”,表示查询区间[a,b]的数的和。题解:线段树+成段更新开long long#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<algorithm&原创 2020-07-03 11:31:10 · 158 阅读 · 0 评论 -
HDU 1698 Just a Hook (线段树+成段更新)
题意:给你T组数据,N个数(初始时每个数的值为1),M个操作,每个操作把区间[a,b]里的数更新为c,问最后这N个数的和是多少。题解:线段树+成段更新#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<algorithm>#include<queue>#inc原创 2020-07-03 11:19:38 · 133 阅读 · 0 评论 -
HDU 5443 The Water Problem (线段树)
题意:给出n个数字,q个查询,查询l~r中最大的数。题解:线段树#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<algorithm>#include<queue>#include<stack>#include<cmath>#in原创 2020-06-15 15:06:02 · 134 阅读 · 0 评论 -
HDU 4339 Query (线段树+单点更新)
题意:给出两个字符串,有两个操作,一个是查询从下标pospospos开始有几个连续相同字符,一个是改变某个字符串中单个字符的值。题解:线段树因为查询的是从某个位置开始有几个相同字符,所以在保存和更新时就保存从左端点开始的结果,查询时也要做类似操作。见代码。#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<...原创 2020-04-04 16:17:13 · 150 阅读 · 0 评论