线段树
HT008_123
家人们点点关注叭
展开
-
[牛客] 买礼物
看到这题目最简单暴力的做法就是树套树或者带修莫队来做 然而数据范围来了 5e5做不了首先我们定义一个next数组 它的意义为与val[i]相同的数字的下一个位置是那里 每次只要查询l-r区间内next数组的最小值 假如区间最小值也在l-r内说明l-r内最少存在一对相同的数字,对于修改我们建立双向链表对线段树单点修改即可#include <iostream>#include <cstring>const int maxm=1e6+100;int pre[maxm],net.原创 2021-02-06 17:27:07 · 296 阅读 · 0 评论 -
[蓝桥杯] 青出于蓝胜于蓝
题目描述:无。题目分析:就是求一个节点子树里有多少个节点编号比这个数小,直接权值线段树动态开点线段树合并就好了。题目链接:题目AC代码:#include <iostream>#include <cstdio>const int maxm=110000;int ans[maxm],root[maxm];int head[maxm],net[maxm*2]...原创 2019-11-26 23:40:41 · 192 阅读 · 0 评论 -
[HAOI2014] 贴海报
题目描述:线段树覆盖题目…题目分析:离散化+线段树区间更新,最后直接遍历一下整个线段树,把标记全部下放一下,最后O1查询就好了…题目链接:BZOJ 5168 Luogu 3740Ac 代码:// luogu-judger-enable-o2#include <cstdio>#include <iostream>#include &...原创 2018-05-03 08:54:41 · 359 阅读 · 0 评论 -
[CTSC2008] 网络管理Network
题目描述:求树链第K大权值,带修.题目分析:如果不带修的话就是个裸的LCA+主席树惹~ 带修惹那就得写带修主席树了… 本题有很多写法 Po猪先写了二分树剖树套树… 复杂度不太科学啊… 反正过了…写了一上午… Splay的常数啊…无力吐槽… 带修主席树…还没写题目链接:Luogu 4175Ac 代码:二分树剖树套树#include <cs...原创 2018-04-23 11:17:55 · 320 阅读 · 0 评论 -
[BJOI2018] 求和
题目描述:求∑x∈Path(u,v)deep(x)k∑x∈Path(u,v)deep(x)k\sum_{x\in Path(u,v)}deep(x)^k题目分析:注意到K比较小 树剖和倍增均可维护…题目链接:BZOJ 5293 Luogu 4427Ac 代码:树剖跑的贼慢…#include <cstdio>#include <algor...原创 2018-04-22 16:18:31 · 965 阅读 · 0 评论 -
[SHOI2016] 随机序列
题目描述:雾。题目分析:加减抵消了。 其实答案里只有一些前缀的积 s[i]=a[1]∗a[2]∗...∗a[i]s[i]=a[1]∗a[2]∗...∗a[i]s[i]=a[1]*a[2]*...*a[i] 那么 s[i]对答案的贡献即为 s[i]∗2∗3n−i−1s[i]∗2∗3n−i−1s[i]*2*3^{n-i-1} 由于修改一个数只会对它及后面的前缀积产生影响 那么就...原创 2018-04-11 14:13:03 · 254 阅读 · 0 评论 -
[HEOI2016/TJOI2016] 排序
题目描述:给出初始序列, 进行m次区间排序操作 输出q位置上的数字题目分析:暴力做法,疯狂排序 O(m∗(nlogn))O(m∗(nlogn))O(m*(nlogn)) 据说可以80分… 正解:二分+线段树 考虑到查询的位置只有一个 我们先二分一个数 建立一颗01线段树 小于二分值的置为0,大于等于二分值的置为1 考虑 排序操作 对于一个区间的升序排列 先查...原创 2018-04-11 14:11:17 · 331 阅读 · 0 评论 -
[Luogu 4137] Rmq Problem / mex
题目描述:给出一个序列 求 l-r 未出现的第一个数是多少题目分析:有三个方法…1.莫队:维护每个数字出现的次数…然后乱搞2.线段树建权值线段树,记录最后出现的位置,整一下可持久化,大概也可以离线搞…3:貌似可以分块…没写…题目链接:Luogu 4137 BZOJ 是权限题目.Ac 代码:莫队:// luogu-judger-...原创 2018-04-10 11:01:49 · 241 阅读 · 0 评论 -
(SPOJ)QTREE - Query on a tree 系列 题解
1:QTREE 1简单描述: 多组数据,维护树上边权,资瓷询问路径最大边权以及修改某个边权. 分析: 简单的树链剖分,转化维护边权为点权,注意初始化#include <cstdio>#include <iostream>#include <algorithm>#include <cstring>const int inf=0...原创 2018-04-10 09:40:59 · 222 阅读 · 2 评论 -
[九省联考 2018] iiidx
题目描述:给出一个序列 重新安排序列的下标 使得 di<=di/kdi<=di/kd_ididid_i不相同的情况成立 比如 4 2.0 1 1 1 2 这组样例 用贪心搞出来的是 1 1 1 2 其实正解应该是1 1 2 1 如果权值有重复的,我们要找和第siz大的权值相等的权值中最靠右的那个点,再给子树预定siz-1个,这样做能够让当前点权值尽可能大的前提...原创 2018-04-09 18:42:50 · 664 阅读 · 0 评论 -
[HNOI2016] 网络
题目描述:维护数据结构 资瓷如下操作: 0 在 u - v 路径上 插入权值 Val 1 取消 第 i 次 0 操作 2 阻断 X 的通讯 即 经过 X 的权值作废 求可行的全局最大权值 若无输出 -1题目分析:先剖一剖 qwq 观察到 每个点会影响经过自己的路径权值 那么我们不妨每次插入的时候 对所有不属于 路径 u - v 的点插入这个权值 在阻断通讯时 我们只需...原创 2018-04-02 09:33:36 · 221 阅读 · 0 评论 -
[LNOI2014] LCA
题目描述:给出一颗树 根节点为 1 给出 M 个 询问 l r z 求∑ri=ldep[lca[i,z]]∑i=lrdep[lca[i,z]]\sum_{i=l}^{r}dep[lca[i,z]] dep为距离根节点的距离+1题目分析:暴力分一点不给差评! 思路来自黄学长 首先 考虑一种暴力 我们把 z 到根上的点全部打标记,对于 l 到 r 之间的点,向上搜索到第...原创 2018-04-01 08:03:37 · 273 阅读 · 0 评论 -
[BZOJ 3730] 震波
题目描述:给出一棵树 每个点有价值Vi 0:u k 询问以u为中心距离不超过k的价值和 1:u v 更改城市 u 的价值为 k题目分析:有修改就是动态的点分了 考虑用两棵线段树维护答案 线段树2维护u的子树到u的价值和,下标是距离 线段树1维护u的父节点的子树到u父节点的价值和,下标是距离 建点分树,容斥一下搞答案,修改的话暴力爬树就好了 线段树不可过,需要用树状数...原创 2018-03-31 08:35:07 · 235 阅读 · 0 评论 -
[TJOI2010] 被污染的河流
题目描述:河水被污染啦题目分析:很明显,每条河流能够污染的区域是一个矩形。 其实本题就是让我们求一个矩形面积并题目链接:Luogu 3875Ac 代码:#include <cstdio>#include <iostream>#include <algorithm>#include <cstring>...原创 2018-04-08 10:31:39 · 293 阅读 · 0 评论 -
[TJOI 2015] 旅游
题目描述:树上可修改的两点间有序差值最大值…题目分析:线段树先分别维护 两个方向的差值最大值 把所有链记录下来 答案要么在一段内,要么最值分别分布在两段内 我们就用每一段的答案更新答案,再单独拿出所有的剖出的链,考虑相互影响来更新答案题目链接:Luogu 3976 COGS 1978 BZOJ 3999Ac 代码:#include <cstr...原创 2018-05-03 17:30:51 · 200 阅读 · 0 评论 -
[CF 438 D] The Child and Sequence
题目描述:维护线段树支持 区间取模 区间求和 单点修改题目分析:维护区间最大值,当本区间最大值 >=mod 时递归修改 一个数取模一个比它小的数,最后的结果肯定小于等于本数的一半 那么一个数最多只会修改lognlognlogn次 那么均摊下来复杂度就是O(N(logN)2)O(N(logN)2)O(N(logN)^2)题目链接:CF 438 DAc 代码:...原创 2018-05-05 15:58:44 · 299 阅读 · 0 评论 -
[POJ 2482] Stars in Your Window
题目描述:给出N个星星的坐标,以及的他们的亮度,给出一个矩形的长和宽,然后求最大值(边上的不算)题目分析:一个星星的贡献区域为 Xi,Yi,Xi+W,Yi+H我们把这个拆成两个线分别为 Xi ,Yi,Yi+H,价值为 valXi+W,Yi,Yi+H,价值为 -val然后把X升序排列,依次在线段树中加入这些线,每次取区间最大值,就可以计算出答案了题目链接:POJ 2482代码:...原创 2019-08-26 17:09:05 · 218 阅读 · 0 评论 -
[CodeForces-19D] Point
题目描述:一个二维平面,有三个操作Add X Y 添加 坐标为 X Y 的点Remove X Y 删除坐标为 X Y 的点Find X Y 寻找 X Y 右上第一个点题目分析:离散化 X坐标线段树套Set,同时维护一个最大值,方便优化查询过程题目链接:CF 19D代码:#include <cstdio>#include <algorithm>#in...原创 2019-08-26 15:08:30 · 168 阅读 · 0 评论 -
[CodeForces 540E] Infinite Inversions
题目描述:有一个无限长1 2 3…的序列,然后又N个操作,把 L R 两个数字换位置问调换完毕后有多少个逆序对。题目分析:离散化,我们把两个数之间没有被操作的数缩成一个数,带个数字数量的权值,然后线段树求逆序对就可以了。题目链接:CodeForces 540E代码:#include <cstdio>#include <iostream>#include ...原创 2019-08-07 19:32:17 · 236 阅读 · 0 评论 -
[模板] 线段树维护区间线性基
单纯放个代码,可能以后用的到…实际上是写了个这玩意疯狂MLE#include <cstdio>#include <iostream>#include <algorithm>#include <cstring>const int maxm=1e5+100;int n,m,tot;int val[maxm];struct node{ ...原创 2019-08-04 20:36:57 · 289 阅读 · 0 评论 -
[HDU 4417] Super Mario
题目描述:给出N个数字 Q个询问,每个询问有三个参数 L R H 问 L-R区间内有多少个数小于等于H题目分析:先把所有的数字离散化,然后搞莫队,对于每个询问添加删除完事之后,在权值线段树上直接询问有多少个点小于等于H就好了主席树做法更简单题目链接:HDU 4417代码:#include <cstdio>#include <cstring>#includ...原创 2019-08-04 17:09:21 · 238 阅读 · 0 评论 -
[HDU 6430] Problem E. TeaTree
前言:复健后的第一题,写了1.5H你敢信?题目链接:HDU 6430题意描述:给出一个N个节点的树,每个树的节点都有一个权值val[i].对于一个节点 X Ans[X]=max(gcd[val[i],val[j]]) (LCA(i,j)==X)现在让你求出每个节点的Ans值题目分析:很明显,对于每个节点的Ans值,我们只需要求在它的子节点子树里出现的出现两次的因数中最大的就好了,...原创 2019-07-06 00:53:22 · 221 阅读 · 0 评论 -
[ACM日记] 个人训练赛14场
前言:过了三题,就这样。A:题目描述:题目分析:我们设定 C0表示目前J出现的次数,以此类推。如果区间[L,R]合法,那么C0L−C0R=C1L−C1R=C2L−C2RC0_L-C0_R=C1_L-C1_R=C2_L-C2_RC0L−C0R=C1L−C1R=C2L−C2R然后开map,记录一下C0-C1,和C1-C2,出现最早的位置,不停的扫取Max就好了。代码:#...原创 2019-07-12 22:36:40 · 239 阅读 · 0 评论 -
[APIO 2015] 八邻旁之桥
题目描述:QAQ…题目分析:看上去看不可做… K只有可能为 1 和 2 我们想一下1的情况怎么做 如果工作地点在一侧,那么路程就是 r-l 然后我们对于不在一侧的线段端点求个中位数 肯定能使总路程最小… 当K为2的时候 取每个线段的中点,如果靠近左边的桥,就往左边过桥,否则往右边过桥。 枚举一个分割点,然后两边都是k=1的情况,用线段树求∑|位置−中位数|∑|位置−中位...原创 2018-05-08 17:24:47 · 235 阅读 · 0 评论 -
[POI2011] ROT-Tree Rotations
题目描述:qwq…题目分析:一棵树中的逆序对个数=左子树的+右子树的+跨越形成的 我们只要比较一下交换之后和之前跨越的逆序对个数,取小即可… 权值线段树+线段树合并题目链接:BZOJ 2212 Luogu 3521Ac 代码:#include <cstdio>#include <algorithm>#include <...原创 2018-05-14 09:33:21 · 344 阅读 · 0 评论 -
[HAOI 2007]上升序列
题目描述:QAQ…题目分析:设 F[i] 为 以 i 为开头最大的上升子序列长度 可以 NlogNNlogNNlogN 求,不再概述了 然后对于每个查询,我们 O(n)O(n)O(n) 去扫 当F[i]>=k 并且大于上一个数的时候,这个数即为我们要求的数列项之一,由于我们是从前往后扫的,所以字典序有保证,不要忘了把长度减小1 线段树完全可以用树状数组代替,然后我闲得慌......原创 2018-05-13 16:46:05 · 201 阅读 · 0 评论 -
[USACO18OPEN] Disruption
题目描述:qwq…题目分析:对于每条额外边x-y,可以作为原树上x-y的路径上的任意一条边删去时的答案,所以路径更新最小值即可。题目链接:BZOJ 5279 Luogu 4374Ac 代码:#include <cstdio>#include <cstring>#include <algorithm>#include &...原创 2018-05-06 11:25:39 · 267 阅读 · 0 评论 -
[Luogu 4315] 月下毛景树
题目描述:QAQ…题目分析:边权转化点权,树剖+线段树,维护最大值,支持区间加和区间覆盖…题目链接:Luogu 4315Ac 代码:#include <cstdio>#include <algorithm>#include <cstring>#include <iostream>const int ma...原创 2018-05-06 08:56:01 · 370 阅读 · 1 评论 -
[Shoi2007] 园丁的烦恼
题目描述:有 N 个 点 每个点坐标为 X Y 有 M 个查询,每个查询表示一个矩形,问这个矩形里有几个点题目分析:二维矩形问题,直接怒打一发 离散化+树套树 然而怎么卡常也只有48分(雾 本题的正确做法是,离线搞! 我们把X Y 存起来,然后按照X升序排列,每次插入 Y ,查询 Y 就好了(雾 连离散化都不用打! 矩形割补求一下题目链接:BZOJ 1935...原创 2018-03-30 08:44:55 · 369 阅读 · 0 评论 -
[TJOI2012] 防御
题目描述:雾。题目分析:对于防御体系爆炸,我们可以维护一个区间最小值来讨论 当某个区间的最小值<=攻击力时,我们就需要找出包体系处 然后我们把这个位置打上标记,改成最大值就行了。 维护sum用一下标记永久化,因为是单点查询题目链接:Luogu 2667 BZOJ 貌似没有数据Ac 代码:#include <cstdio>#in...原创 2018-03-30 08:43:06 · 228 阅读 · 0 评论 -
[SDOI 2011] 染色
题目描述:给出N个点的初始颜色 定义一条路径上的颜色数量为不同颜色的路径段数 如110110 为4种颜色 给出M个操作 Q u v:查询 u v 路径上的颜色数量 C u v x :将 u v 路径上的点全部染成 x题目分析:树剖+线段树 在合并左右儿子信息的时候 我们只需判断一下左儿子的右节点颜色和右儿子的左节点颜色即可得到父节点信息 注意,在进行树剖查询时也要注...原创 2018-03-19 21:04:12 · 187 阅读 · 0 评论 -
P2146 [NOI2015]软件包管理器
1.对于安装软件操作 首先查询根节点到查询点路径上已安装软件个数。 然后从根节点到当前节点路径插入值1 然后再查询根节点到查询点路径上已安装软件个数。 两者相减即为答案。 2.对于卸载软件操作 跟安装软件操作大致相同。只是要注意我们不能够同时安装多个相同软件软件。 所以区间修改方式略有不同。 如何维护呢? 只需要这样//每次插入时num为1,删除时为0,这样就可以做到只安原创 2018-01-06 17:00:58 · 309 阅读 · 0 评论 -
P3038 [USACO11DEC]牧草种植Grass Planting
之前我们的树剖都是处理点权问题,现在变成了边权。如何转化呢? 首先,题目强调的加权是边而不是点,所以我们必须将为边加权转化成为点加权。对于每条边,我们将其深度更大的端点加权,则区间 [l, r] 的加权(或询问)即为去掉深度最小的点,给其余点加权(或询问)。这么一听处理起来似乎很麻烦,但我们可以思考下树剖查询的过程:1)最后一次树剖查询时,当前两点 x,y 必定在同一重链上(y 的深原创 2018-01-06 15:53:28 · 275 阅读 · 0 评论 -
HAOI[2015]树上操作
树链剖分裸题。 需要注意的是,此题要开long long 中间变量也要开long long (坑死了) 话说自己搞到组数据,结果死活在自己电脑上RE。 后来发现是爆栈了。 下篇博客发一下本地扩栈的方法。 题目#include #include #define lson (o#define rson (o#define ll long longusing namespace原创 2018-01-06 14:15:57 · 187 阅读 · 0 评论 -
ZJOI[2008]树上统计
一道树剖的裸题,连区间修改都不用,只需要单点修改,区间最值,区间求和即可。 需要注意的是,此题有负数,求最大值时需要考虑。 题目传送门#include #include #define lson (o#define rson (ousing namespace std;const int maxm=310000;int deep[maxm],son[maxm],size[max原创 2018-01-06 10:04:52 · 296 阅读 · 0 评论 -
[NOI 2016] 区间
题目分析:NOI DAY2 T1 差不多是送分的,然而对于我这种蒟蒻而言,小细节却错了不少,思路倒是不难。部分 分 分析1.最最最暴力的思路:直接DFS深搜,在深搜过程中进行维护区间和更改答案的操作 总的复杂度为O(C(n,m)) 期望 30(实际上BZOJ只得了25,T的原因不知道为啥。2.将最优化问题转化为枚举答案判断问题:我们注意到总的花费大小只跟 最长...原创 2018-01-22 17:38:46 · 205 阅读 · 0 评论 -
无题
k<=10 ! 并不是严格的区间第K大值问题。 只需要暴力维护前10大值就行了。push_down的时候,没有值的地方不可以加!#include <cstdio>#include <iostream>#include <cstring>using namespace std;const int maxm=1e5+1; struct node{ int maxn[11];原创 2017-11-02 14:46:24 · 191 阅读 · 0 评论 -
洛谷10月月赛R1·浴谷八连测R1·提高组 T2
传送门! 最简单的暴力:输出N(20)! 正解DP: 60DP: dp[i][j]为选第i行到第j位置最长的符合要求的序列长度。 我们把第三个序列选上升的定义为dp[3][j] 下降的定义为dp[4][j]。 状态转移: 很明显 dp[1][j]=max(dp[1][1->(j-1)],dp[2][1->(j-1)],dp[3][1->(j-1)],dp[4][1->(j-1)]原创 2017-10-15 14:55:48 · 297 阅读 · 0 评论 -
选择客栈
QAQ 我的SB做法 把每个颜色的位置记下来,枚举一个开头颜色位置,看看后面最少到哪里就可以符合要求了,查询用线段树。(位置只会往后)#include <cstdio>#include <iostream>#include <ctime>using namespace std;const int maxm=200100;int p[maxm];int st[maxm*4];int原创 2017-10-19 17:33:16 · 372 阅读 · 0 评论 -
线段树(区间修改)
题目区间修改有乘法和加法并存,开两个lazy标记,注意两个lazy标记的下放方式(在注释中)#include <cstdio>#include <iostream>#define ll long long using namespace std;const int maxn=120000;int p;struct tree{ ll adx,adi;//adx为乘法标记,adi为加原创 2017-08-06 09:36:12 · 258 阅读 · 0 评论