线段树
a1214034447
这个作者很懒,什么都没留下…
展开
-
Codeforces Round #851 (Div. 2) A-E
Codeforces Round #851 (Div. 2)原创 2023-02-21 22:46:53 · 336 阅读 · 0 评论 -
BZOJ 4066 - KDtree + 重构
题目链接:点击这里解题思路:这题被强制在线了如果是离线(BZOJ 2683)可以CDQ分治 + 树状数组做.所以只能用KDtree了.若每次都将新节点插入原DKT中,最终会导致树会非常的不平衡,而失去了意义,导致超时.所以我们要设置一个阈值,当节点数到达阈值时就对KDT进行重构保证稳定.#include<cstdio>#include<cs...原创 2018-10-03 13:59:00 · 277 阅读 · 0 评论 -
BZOJ 2648 - KDtree+新建节点
题目链接:点击这里解题思路:对原始的N的点建立KDtree,对于M个操作,黑棋加入新节点,白棋查询最近曼哈顿距离.这就迎刃而解了.#include<bits/stdc++.h>#define inf 0x3f3f3f3f#define fi first#define se secondusing namespace std;const int mx ...原创 2018-10-03 13:53:06 · 367 阅读 · 0 评论 -
Codeforces Round #603 (Div. 2) 题解
题目链接:https://codeforces.com/contest/1263A - Sweet Problem把最小值分摊给其他两个,然后剩下的再加上最小值#include<bits/stdc++.h>#define x first#define y second#define inf 0x3f3f3f3fusing namespace std;typ...原创 2019-12-04 13:38:54 · 305 阅读 · 0 评论 -
2019-2020 ICPC, Asia Jakarta Regional Contest (Online Mirror, ICPC Rules, Teams Preferred)
题目链接:https://codeforces.com/contest/1252A - Copying Homework水题#include<bits/stdc++.h>using namespace std;const int mx = 1e5+5;struct node{ int id,x; bool operator<(const node &...原创 2019-11-06 23:27:22 · 428 阅读 · 0 评论 -
hdu 3308 - 线段树
题目链接:https://vjudge.net/problem/HDU-3308 解题思路:题目很明显的线段树,但不是那么好写。要求区间最长的连续递增长度,那么需要多考虑的就是当左右区间合并时如果右区间的左边界值大于左区间的右边界值时,会合并出一个新的连续递增段,所以我们还要维护一个区间的左右边界最长上升长度才行。 #include<bits/stdc++.h>...原创 2019-02-26 16:32:41 · 145 阅读 · 0 评论 -
Gym - 101955E(2018 ICPC沈阳) - 曼哈顿转切比雪夫+线段树
题目链接:https://vjudge.net/problem/Gym-101955E 解题思路:距离转化:https://www.cnblogs.com/zwfymqz/p/8253530.html将一个点(x,y)的坐标变为(x+y,x−y)后,原坐标系中的曼哈顿距离 = 新坐标系中的切比雪夫距离将一个点(x,y)的坐标变为((x+y)/2,(x−y)/2) 后,原坐标系中...原创 2019-02-24 18:55:10 · 528 阅读 · 0 评论 -
ZOJ - 4066(2018 ICPC青岛现场赛 I)
题目链接:https://vjudge.net/problem/ZOJ-4066 解题思路:"枚举最小值+线段树维护可行解最大值最小化"我们可以把所有可选区间化成n个长度为1的区间,和n-1个长度为2的区间。将这2*n-1个数从大到小排序,枚举最小值,然后线段树查询更新区间最小值(因为最大到小插入所以之前的肯定大于现在的值)每个区间维护这么一个东西;struct node...原创 2018-12-07 19:27:24 · 617 阅读 · 0 评论 -
IndiaHacks 2nd Elimination 2017 B
题解思路:这题暴力也能过,暴力和线段是也就差了300ms左右。那么我们讲线段树怎么做minv[o]表示从这个区间的左边界出发经过这个区间内的任意一点后到达1的最小距离,当然当时从一颗子树的叶子节点跟另一颗子树的某几个头节点组成的区间是无效的不需要纠结。addv【o】保存的是o-(o>>1)之间向上父节点的几段距离。那么就有minv[o]=min(minv[lc]+addv[lc],...原创 2017-08-09 14:19:47 · 234 阅读 · 0 评论 -
hdu 6392 - 线段树 + 并查集
题目思路:http://acm.hdu.edu.cn/showproblem.php?pid=6392解题思路:线段树叶子维护每列并查集的情况,每个区间维护最左端列的祖先和最右端列的祖先(这里它们维护的祖先是区间内的祖先不是整个矩形的祖先)。在区间合并的时候要先初始化左右子区间的左右端列的祖先,因为它们的祖先可能已经不再子区间中了,在之前的合并中已经跑出去。在这次新的合并中要使得...原创 2019-03-02 21:37:10 · 328 阅读 · 0 评论 -
Codeforces Round #546 (Div. 2) 题解
题目链接:http://codeforces.com/contest/1136A. Nastya Is Reading a Book水题。#include <bits/stdc++.h>#define fi first#define se second #define lson l,mid,rt<<1#define rson mid+1,r,rt...原创 2019-03-19 21:16:01 · 203 阅读 · 0 评论 -
CodeForces - 587E[线段树+线性基+差分]
题目链接:https://vjudge.net/problem/CodeForces-587E解题思路:对原序列a进行差分,使得b[i] = a[i] ^a[i+1],那么al,al+1,al+2,ar可以构成的一个异或和,在al,bl,bl+1,bl+2,br-1中肯定也可以被构造出来,因此二者是等价的。对于a序列的区间[l,r]的更新实际上b序列上只有bl-1和br被影响,...原创 2019-05-11 16:50:01 · 418 阅读 · 0 评论 -
Comet OJ - Contest #3 A-D
题目链接:https://www.cometoj.com/contest/38/problemsA.比赛暴力枚举+排序#include <bits/stdc++.h>using namespace std;typedef long long ll;typedef unsigned long long ull;const int mx = 500 + 10;...原创 2019-05-11 17:30:12 · 315 阅读 · 0 评论 -
牛客想开了大赛2 题解
题目链接:https://ac.nowcoder.com/acm/contest/907#questionA.【六】平面公式:(n*n+n)/2 + 1,n为直线数目B.【一】n的约数枚举质因子和每个质因子的个数,显然个数肯定从多到少。#include<bits/stdc++.h>typedef long long ll;using namespace ...原创 2019-06-01 17:05:51 · 141 阅读 · 0 评论 -
2019 Asia Nanchang 网络赛 C[线段树矩阵合并]
题目链接:https://www.jisuanke.com/contest/3870?view=challenges解题思路:也就是CF这道题反着过来,这一题变成和右结合。道理还是五个状态,反过来看:1、2都没有2、2后面没有接03、20后面没有接14、201后面没接95、有2019然后用dp[i][j]表示从i转态转移到j转态的最少花费,我们一开始当然是...原创 2019-09-08 22:39:51 · 216 阅读 · 0 评论 -
ICPC Asia Nanjing 2019 网络赛 [李超树]
题目链接:https://nanti.jisuanke.com/t/41306解题思路:一个前提结论就是假定第i个人开始是机洗,那么他前面的肯定都是手洗他后面的都是机洗。这也很好证明,假定我第j个人是手洗,那么j之前的人肯定也都能手洗而不影响结果。那么就有答案当机洗时间是x时,很明显对于一个i是取a[i]+y,还是a[i]+(n-i+1)*x,它们的分界点就是y/(n-i+1...原创 2019-09-13 16:44:57 · 210 阅读 · 0 评论 -
bzoj 1938 - 类欧几里得+线段树
题目链接:https://darkbzoj.cf/problem/1938 解题思路;对于区间更新:前半部分可以用线段树求等差数列和,后半部分可以用类欧几里得算法求出值类欧几里得然后是要对区间离散化,其中有个问题在于对于区间(l,r)分裂为(l,mid)和(mid+1,r)都是mid-mid+1中还有值,所以对于区间(l,r)实际包含的是(num[r+1]-num[...原创 2018-10-25 18:27:34 · 364 阅读 · 0 评论 -
ACM-ICPC 2018 焦作赛区网络预赛 E - 树链剖分 + 多重标记
题目链接:点击这里 解题思路:如果这题只有乘法和加法操作那么我们可以直接套树链剖分 + 多重标记,那么我们就想办法把取反变为加法和乘法.!x = (2^64-1) - x, -x % (2^64) = (2^64-1)*x % (2^64) , !x = (2^64-1)*x + (2^64-1)这样就把取反也转化成加法和乘法的操作啦.而且我们并不需要去快速乘,因为数...原创 2018-09-17 20:26:02 · 201 阅读 · 0 评论 -
大学生程序设计邀请赛(华东师范大学)-D-线段树
链接:点击打开链接题解:二分预处理出来每个点单次传染到的左右范围,再用线段树维护每个点最终的范围最小值、最大值,利用线段树不断扩大范围并更新。随机一个 1 ~ n 的序列利用线段树更新,这样速度会变得很快,或其他优化方法均可(这里采用sin函数排序差不多就无序了= =)。还有就是注意题目是按原来的i输出,我因为这个被卡了一下午,MDZZ。代码:#incl原创 2017-05-15 18:54:52 · 260 阅读 · 0 评论 -
zoj 3633 rmq或线段树
两个方法基本差不多,记住最近一次出现这个数的位置,就可以了。RMQ :#include#include#include#include#include#include#include#includeusing namespace std;typedef long long ll;const int mx=5e5+10;int n,m,num[mx],kep[m原创 2017-05-06 16:54:43 · 296 阅读 · 0 评论 -
poj 3468-线段树
题解;暴力线段树肯定超时,这里只能采用”继承”方式将父亲增加的值传给儿子细化操作。代码#include#include#include#include#include#include#define lson l,mid,rt<<1#define rson mid+1,r,rt<<1|1using namespace std;typedef long long ll;原创 2017-06-19 21:23:05 · 278 阅读 · 0 评论 -
“盛大游戏杯”第15届上海大学程序设计联赛夏季赛暨上海高校金马五校赛-专题
题目链接:点击打开链接说明:前五题简单题就不写了。。。F:这是裸nlogn的求最长上升序列算法,前后各求一下取小就行了。#include#include#include#include#includeusing namespace std;typedef long long ll;const int mx = 5e5+10,mod = 1e9+7;i原创 2017-07-10 19:27:32 · 585 阅读 · 2 评论 -
poj-3264-线段树
题解思路:线段树维护每段中的最大和最小值。代码:#include#include#include#include#define lson l,mid,rt<<1#define rson mid+1,r,rt<<1|1#define inf 0x3f3f3f3fusing namespace std;typedef long long ll;const int mx原创 2017-07-11 14:40:37 · 527 阅读 · 1 评论 -
hdu 6155 - 线段树+矩阵
题目链接:点击打开链接 题解思路:假设dp[i][1]为到i位置尾部是1个个数有几个,dp[i][0]也是如此,那么假设第i个位置放1,那么dp[i][1] = dp[i-1][1]+dp[i-1][0]+1,dp[i][0] = dp[i-1][0],如果第i个位置放0那么dp[i][0] = dp[i-1][1]+dp[i-1][0]+1,dp[i][1] = dp[i-1][1].我...原创 2017-08-23 18:41:35 · 590 阅读 · 0 评论 -
hdu 6194 - 后缀数组+线段树
题目链接:点击打开链接题解思路:用后缀数组处理得到的hight数组后,对它再进行线段建树,维护的是区间内最小的一个值,那么我们每次取枚举一个长度为n的区间时,取它的最小值这表示从1-ans_min的字符串长度都是满足的,那么题目还要求正好n次重复,那么我们就再取两次一个的左边界加一的区间值,一个是右边界加一的区间值,取两值的max那么此区间可取范围就应该是(左右边界+1的max,ans_min原创 2017-09-10 23:33:45 · 1317 阅读 · 0 评论 -
ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛 I题
题解思路:根据题意我们只需要维护区间最大的值和最小的值就够了,那么当最大的是小于0的那么就用最大的自身相乘,如果最小的是正数那么就是最小自身相乘,要是最小小于0最大大于0那么就是最大乘最小。代码:#include#include#include#include#include#include#define lson l,mid,rt<<1#define rson mi原创 2017-09-27 17:07:13 · 586 阅读 · 0 评论 -
hdu 4052 线段树求面积并
解题思路:我们可以将这个问题转换成看一个坐标向上或者想右(分别表示了竖着和横着)可以放一个新的机器,那么原来旧的机器所占的位置就可以用两个计算面积方式来求面积并,最后用总面积减去机器所占面积就行了。#includeusing namespace std;typedef long long ll;const int mx = 1e5+10;int W,H,N,M;ll ma原创 2017-12-14 14:04:52 · 224 阅读 · 0 评论 -
牛客网暑期ACM多校第六场I - 线段树
题目链接:点击这里 解题思路:这题还不让离线真的是,不过它把关键放在了删除上面,这就是一个区间被覆盖之后就会被删除了。那么这个问题就可以用O(nlogn)来解决了.用左端点l来离散建立线段树,右端点r作为区间值。线段树维护区间最大值.那么我们去查询x的时候实际上就是在线段树[1,x]中去查找值不小于x的点,然后把它删除,之后改变他的值为负无穷,因为他已经被删除了。这就是为什么可以用...原创 2018-08-04 23:12:48 · 101 阅读 · 0 评论 -
快速了解二维线段树
学习二维线段树时想必肯定已经会了一维的了。那么二维线段树其实可以简单的理解为固定了一维然后在另一维上跑一维的线段树。一维线段树上的数组的每个下标代表着一个区间,那么同样的二维线段树则是二维的数组,第一维下标表示第一维的区间,第二维代表第二位区间。我们用(l,r)表示区间l到r的下标如果我们要查询(x1,y1)为左下角,(x2,y2)为右上角的矩阵和,即为[x1,x2,y1,y2]....原创 2018-08-24 19:10:08 · 4213 阅读 · 0 评论 -
poj 1195 - 二维线段树
解题思路:二维线段树入门题点击入门 //poj 1195#include<cstdio>#include<iostream>#define lson l,mid,rt<<1#define rson mid+1,r,rt<<1|1using namespace std;typedef long long ll;cons...原创 2018-08-24 19:13:20 · 230 阅读 · 0 评论 -
hdu 1823 - 二维线段树
题目链接:点击这里 解题思路:把身高看做一维,活泼度看做一维,做基本的二维线段树区间求最大,小数点先乘10把它化为整数才能做线段树。 #include<cstdio>#include<iostream>#include<cstring>#define lson l,mid,rt<<1#define rson mid+1,...原创 2018-08-24 19:23:57 · 232 阅读 · 0 评论 -
poj 2155 - 懒惰标记二维线段树
解题思路:这里简单粗暴的用了懒人标记的二维线段树,实际上可以利用01异或的性质可以不用去更新儿子,直接把有包含(x,y)点的矩阵都异或起来就行了。 #include<cstdio>#include<iostream>#include<cstring>#define lson l,mid,rt<<1#define rson ...原创 2018-08-24 19:36:16 · 275 阅读 · 0 评论 -
落谷 P3373 - 线段树多重标记入门
题目链接:点击这里 解题思路:以前做区间修改都是一种标记,可以直接标记.而现在这题既有乘法更新又有加法更新,如果再按以前的思想循序更新就肯定会出错.所以在多重标记的情况下我们可以给它们制定一个优先级的规则,假设每次的更新都是乘法优先于加法.那么更新操作要怎么改变呢?设add[]为加法懒惰标记,mul[]为乘法懒惰标记.对区间rt进行加x操作:直接add[rt] += x...原创 2018-09-17 20:15:04 · 311 阅读 · 0 评论 -
hdu 4027 Can you answer these queries? -线段树
题目链接 :点击打开链接题目要求开根那么再大的一个数不超过十次开根就会变成1,那么此时就不需要再更新了,所以用线段树只需特判这个点就可以了。题解:#include#include#include#include#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1using namespace std;typede原创 2017-05-05 18:44:38 · 249 阅读 · 0 评论