线段树
文章平均质量分 60
里阿奴摩西
这个作者很懒,什么都没留下…
展开
-
[单调栈 线段树] Codeforces 407E Round #239 (Div. 1) E. k-d-sequence
首先肯定是一段模 dd 相同的数 然后枚举左端点 那么右端点应该满足条件 数字不重复出现且 maxvl,r−minvl,r≤r−l+kmaxv_{l,r}-minv_{l,r}\le r-l+k,这个最大最小值是除过 dd 的 也就是maxvl,r−minvl,r−r≤k−lmaxv_{l,r}-minv_{l,r}-r\le k-l 左端点边挪边用单调栈维护最大最小值 入栈出栈就线段树上区间原创 2017-07-05 20:16:13 · 534 阅读 · 0 评论 -
[类欧几里得算法 线段树] BZOJ 1938 [CROATIAN2010] ALADIN
直接在线段树上区间覆盖咯 怎么求和? ∑x=lr(A∗x) mod B=∑x=lrA∗x−B∗∑x=lr⌊A∗xB⌋\sum_{x=l}^r (A*x)\ mod\ B=\sum_{x=l}^r A*x-B*\sum_{x=l}^r\lfloor {A*x \over B}\rfloor后半部分直接用类欧求就好了 类似 [类欧几里得算法 数论] BZOJ 2987 Earthquake 但是更原创 2017-03-18 20:12:17 · 1315 阅读 · 0 评论 -
[字符串Hash 线段树] AOJ 2734 Donut Decoration
考虑把每个点看成一个可以在后面加字符的字符串 每次区间加一个字符串 相当于对区间的hash值做一次运算 这个直接线段树就行了#include<cstdio>#include<cstdlib>#include<algorithm>using namespace std;typedef unsigned int uint;inline char nc(){ static char buf原创 2017-03-03 20:56:28 · 358 阅读 · 0 评论 -
[李超线段树 模板题] BZOJ 1568 [JSOI2008]Blue Mary开公司
模板题 复习下 顺便骗骗访问量 奇怪的是这个题上网找标程 自己和标程对拍拍出错 标程之间对拍也拍出错 但就是都A了#include<cstdio>#include<cstdlib>#include<algorithm>#include<cmath>using namespace std;inline char nc(){ static char buf[100000],*p1原创 2017-02-01 22:42:15 · 654 阅读 · 0 评论 -
[删边最短路 并查集||线段树] BZOJ 2725 [Violet 6]故乡的梦 & 4400 tjoi2012 桥
首先求出一条S到T的最短路P,如果不是最短路上的边删了肯定不影响答案。接着证明去掉一条边(u,v)之后最短路一定是这样存在一条边(x,y),然后最短路径是S->x->y->T,并且S->x,y->T都是原图中的最短路。考虑S的最短路径图和T的最短路径图。于是只要考虑一条边(x,y),然后求出S到x的最短路和这条最短路最早什么时候离开P,记作x’,同理求出y’。于是(x,y)这条边可原创 2016-11-04 07:04:50 · 2058 阅读 · 0 评论 -
[Treap套权值线段树 线段树分裂与合并] BZOJ 4552 [Tjoi2016&Heoi2016]排序
线段树合并写了不少 分裂是第一次 直接每一个有序区间用一棵权值线段树维护有哪些数 外层用treap维护顺序 然后排序就把代表这段的很多颗线段树合并在一起 两端处会割开某个有序区间 会涉及分裂操作#include<cstdio>#include<cstdlib>#include<algorithm>using namespace std;inline char nc(){ static原创 2017-01-30 19:34:55 · 1345 阅读 · 0 评论 -
[后缀自动机 线段树] BZOJ 1396 识别子串 & BZOJ 2865 字符串识别
后缀自动机建起来发现出现一次的子串必然由|right(x)|==1的状态也就是叶子节点贡献 对于每个叶子x 在串上的位置为p 令l为maxs(x) 令r为maxs(fat(x)) 那么区间[p-r+1,p]用r+1更新答案 区间[p-l+1,p-r]用一条斜率为-1的线段更新答案 这个可以暴力跑李超线段树 但是这道题很特殊啊 直接上两颗线段树分别维护两种情况就好了上2865的代码吧 这题t原创 2017-01-30 19:30:01 · 736 阅读 · 0 评论 -
[线段树合并] BZOJ 2733 永无乡
启发式合并至今不知道时空复杂度怎么保证,从不证明算法复杂度,只会用大数据实测一下......#include#include#include#includeusing namespace std;inline char nc(){ static char buf[100000],*p1=buf,*p2=buf; if (p1==p2) { p2=(p1=buf)+frea原创 2016-03-14 10:15:32 · 927 阅读 · 0 评论 -
[替罪羊树 动态标号 线段树] BZOJ 3600 没有人的算术
好题啊 首先肯定是线段树 那么考虑我们怎么比较两个数的大小 采用CLJ在重量平衡树和后缀平衡树在信息学奥赛中的应用中提到的标号思想 不妨令每个节点表示一个区间 用区间的中值代表这个数的大小 具体实现是我们不仅要给每个点记录 l,r,mid 还要记录 x y 表示他等价于(x,y)的组合 因为新插入数是没有标号的 只能按定义比较first和second 注意0小于任何数 我没想到好的方法原创 2017-01-29 22:11:58 · 547 阅读 · 0 评论 -
[Treap模拟 线段树] Codechef COT5 Count on a Treap
传送门Description在计算机科学中,Treap根据键值是一棵二叉搜索树,根据权值是一个堆(本题中为大根堆) 。 你的任务是维护一棵Treap,支持以下操作0 k w 插入一个新节点,键值为k,权值为w。1 k 删除键值为k的节点。2 ku kv 输出键值为ku和kv的两个点之间的路径长度。保证没有两个点键值相同或权值相同,并且删除一个点时该点存在。Analysis考虑如何是如何建T原创 2017-03-01 21:09:44 · 973 阅读 · 0 评论 -
[Splay模拟 线段树 || Splay || LCT] HDU 4942 Game on S♂play
做法颇多算法一形式化地描述要进行什么操作。旋转节点:link/cut 。更改两个点的子树和:单点修改。询问一个点子树内子树和的积:子树询问。可以在LCT上维护轻儿子信息(小Toptree),这样就可以子树询问了。轻重边切换的时候顺便维护这个。复杂度O(n log n),期望得分70 - 100分。算法二子树询问的是积,具有可减性。可以转化原创 2016-07-16 17:57:19 · 714 阅读 · 0 评论 -
[线段树 最长上升序列] BZOJ 2957 楼房重建
这个显然可以分块 但实际上线段树是这个模型的经典解法 考虑T[x]T[x]为仅考虑这个区间 上升序列的长度 那么T[x]T[x]肯定包含T[lsx]T[ls_x] 关键是怎么接上rsxrs_x的那一部分 关键在于这个函数 find(x,v)find(x,v) 表示xx这个区间 左边接一个vv 上升序列的长度是多少如果当前左儿子最大值M[lsx]<=vM[ls_x]<=v 区间左儿子一定会被原创 2017-03-01 20:53:21 · 911 阅读 · 0 评论 -
[均摊 平衡树 || 线段树] HDU 5634 Rikka with Phi
用平衡树维护 分析同 [均摊 平衡树 || 线段树] Codeforces 438D #250 (Div. 1) D. The Child and Sequence#include#include#includeusing namespace std;typedef long long ll;inline char nc(){ static char buf[100原创 2017-01-19 11:45:28 · 466 阅读 · 0 评论 -
[均摊 平衡树 || 线段树] Codeforces 438D #250 (Div. 1) D. The Child and Sequence
传说中的cf250 china场题意就是区间取模 区间求和 单点修改每个数被取模了 肯定会减小一半 一个数最多只要log次就能不动把相同的数缩成一段每一段最多被修改O(log n) 次每一次修改会增加O(1) 段用平衡树维护 复杂度是 nlog2n 的对应的势能函数是每一段的log值的和总势能是(n+m)logn每次操作log复杂度 能够降1那么就是两个lo原创 2017-01-19 11:41:12 · 536 阅读 · 0 评论 -
[均摊 线段树] UOJ #228. 基础数据结构练习题
靠信仰做题其实很好感性的理解复杂度想象数列是一排山峰高低不平 可以用O(K*n)次开根把他们削平区间加操作不过是把其中一段整体抬高 只要在这段两边多做常数次就能把他削平Evan可是用偏导证明的 %%%#include#include#include#include#define mid ((l+r)>>1)using namespace std;type原创 2016-09-25 16:39:31 · 954 阅读 · 0 评论 -
[线段树 区间最值操作] HDU 5306 Gorgeous Sequence
详见吉丽的集训队论文 这里实现我把最大值和标记合并在一起了#include<cstdio>#include<cstdlib>#include<algorithm>using namespace std;typedef long long ll;inline char nc(){ static char buf[100000],*p1=buf,*p2=buf; if (p1==p2)原创 2017-02-07 17:01:09 · 393 阅读 · 0 评论 -
[费用流手动增广 线段树] BZOJ 3267 KC采花 && 3272 Zgg吃东西 && 3638 Cf172 k-Maximum Subsequence Sum
费用流构图发现这个图比较特殊,可以手动增广就是选择一个最大和子串,然后全部取反线段树实现#include#include#includeusing namespace std;inline char nc(){ static char buf[100000],*p1=buf,*p2=buf; if (p1==p2) { p2=(p1=bu原创 2016-05-02 13:31:05 · 1000 阅读 · 0 评论 -
[线段树 均摊复杂度] BZOJ 2130 魔塔
不会做QAQ 还是转身向Claris的题解吧#include<cstdio>#include<cstdlib>#include<algorithm>using namespace std;inline char nc(){ static char buf[100000],*p1=buf,*p2=buf; return p1==p2&&(p2=(p1=buf)+fread(buf,1,1原创 2017-03-21 23:49:58 · 687 阅读 · 0 评论 -
[线段树] BZOJ 4388 JOI2012 invitation
最近真的懒 Claris的题解#include<cstdio>#include<cstdlib>#include<algorithm>#include<vector>#include<queue>#define pb push_backusing namespace std;typedef long long ll;inline char nc(){ static char buf原创 2017-04-09 20:45:32 · 370 阅读 · 0 评论 -
[几何 扫描线 最大子段和] JOI Open Contest 2017 Bulldozer
题目大意:给出平面上n个带权点,有正有负,求平面上两条平行直线之间的点权和最大是多少 VIEW PROBLEM - BULLDOZER (JOI17_BULLDOZER)直接枚举斜率,点按照距离排序后是一个最大子段和问题 然后考虑扫描线旋转斜率,两个点相对关系变化只会发生在斜率与两点连线平行的情况,那么两点位置swap一下,更一般的如果是一段都满足这个,那么这一段要reverse一下 就是把两原创 2017-07-05 07:50:00 · 552 阅读 · 0 评论 -
[线段树] Codeforces Round #419 (Div. 1) D. Karen and Cards
从小到大枚举xx,剩下的限制是y>bi⋀z>ciy>b_i \bigwedge z>c_i或者y>bi⋁z>ciy>b_i \bigvee z>c_i 对应的是平面上一个矩形或者挖掉一个矩形 发现平面上矩形的交取个min就好了,挖掉的矩形要取并,这个可以用平衡树或线段树维护 大概是这样,我是灵魂画师 #include<cstdio>#include<cstdlib>#include<al原创 2017-06-22 20:21:15 · 397 阅读 · 0 评论 -
[二分图匹配 线段树] Codeforces 573D Round #318 [RussianCodeCup Thanks-Round] (Div. 1) D. Bear and Cavalry
如果没有限制,显然根据排序不等式 当每个点最多有一个限制不能选的时候,有一个很重要的性质 性质:i对应的点与i的距离<=2 证明: 设有一种情况i对应i+3 i—–(i+3) i+1—(i+2) i+2—(i) i+3—(i+1) 那么,对于i,i+1来说,必定在(i–i+2),(i+1–i+3)中有一个限制必选,否则交换i,i+1更优 同理,(原创 2017-07-11 22:12:27 · 534 阅读 · 0 评论 -
[线段树] Codeforces 811E Round #416 (Div. 2) E. Vladik and Entertaining Flags
线段树 直接维护一段区间的答案 以及左右边界之间的连通性 然后合并的时候 根据中线并查集合并下 这么大常数竟然过了#include<cstdio>#include<cstdlib>#include<algorithm>using namespace std;inline char nc(){ static char buf[100000],*p1=buf,*p2=buf; ret原创 2017-06-01 20:56:56 · 394 阅读 · 0 评论 -
[线段树 杂题] Codeforces 806E VK Cup 2017 Round 3 E. Blog Post Rating
这个我们发现排好序后跑答案是最大的 然后就是维护一个支持插入的序列 我本来想把权值相同的压成一段 然后就gg 出门左转神犇学弟博客#include<cstdio>#include<cstdlib>#include<algorithm>using namespace std;inline char nc(){ static char buf[100000],*p1=buf,*p2=buf;原创 2017-05-20 07:23:18 · 646 阅读 · 0 评论 -
[二进制分组 线段树 || 点分治 分治] UOJ #191 【集训队互测2016】Unknown
详见lzz的集训队论文二进制分组做法二进制分组是在线段树的结构上做的 方便区间查询 至于删除 采用延迟重构的思想 每一层只有最后一个区间是萎的 我们需要递归下去 询问还是O(logn)O(\log n)个节点 重构复杂度势能分析下O(nlogn)O(n\log n) 只有上凸包是有效的 合并的时候采用归并加Graham可以做到O(n)O(n) 不然以我的常数 T的血惨 但是卡内存 只有90分#原创 2017-05-28 11:15:45 · 3471 阅读 · 0 评论 -
[历史最值问题] UOJ #164 【清华集训2015】V
详见吉丽的集训队论文吧我们发现修改操作可以变为这样一个形式S:x=max(x+A,B)S:x=max(x+A,B) 这个标记是可以合并的 就可以求当前值了 现在还要历史最值 我们就再加一个标记SSSS表示历史最大的标记 因为这个形式是一条折线 所以历史最大也是可以合并的 具体的我们两段时间有两对标记S,SSS,SS和s,sss,ss 时间先后分别对应pushdown时的父亲儿子关系 我们发现原创 2017-05-28 11:06:13 · 605 阅读 · 0 评论 -
[Segment tree Beats! || 分块] Codeforces 793F Tinkoff Challenge - Elimination Round F. Julia the snail
我们用fif_i表示左边界是ii的答案 一条线段[a,b][a,b]对答案的影响是 f1f_1到flf_l中大于等于aa的都跟bb取max 这个可以用线段树科技做 复杂度证明跟区间最值操作的势能分析应该差不多#include<cstdio>#include<cstdlib>#include<algorithm>#include<cassert>using namespace std;inl原创 2017-05-28 10:59:49 · 1227 阅读 · 0 评论 -
[扫描线 二分图最大匹配 线段树优化网络流] Codeforces 793G Tinkoff Challenge - Elimination Round G. Oleg and chess
这个我们首先可以转化成一个二分图最大匹配的模型 但是肯定跑不出 首先扫描线 把free的格子剖成O(n)O(n)个矩形 对两边都建成线段树 每个矩形对应两边各O(logn)O(\log n)个点 两两相连 总边数O(nlog2n)O(n\log^2n)#include<cstdio>#include<cstdlib>#include<algorithm>#include<cstrin原创 2017-05-28 10:50:50 · 1058 阅读 · 0 评论 -
[线段树 区间最值操作 模板 Segment tree Beats!] BZOJ 4695 最假女选手
鬼畜线段树的大模板题 具体见吉丽的集训队论文 我终于会写线段树了 不对 我好像还不会历史最值#include<cstdio>#include<cstdlib>#include<algorithm>using namespace std;typedef long long ll;inline char nc(){ static char buf[100000],*p1=buf,*p2=b原创 2017-02-07 17:04:09 · 1727 阅读 · 0 评论 -
[线段树] BZOJ 4821 [Sdoi2017]相关分析
拆开柿子之后 发现要维护 ∑xi\sum x_i,∑yi\sum y_i,∑x2i\sum x_i^2,∑xi∗yi\sum x_i*y_i 直接线段树就好了 两个标记合并的时候要注意下 一种可以覆盖另一种 似乎神犇有更短更快的方法? #include<cstdio>#include<cstdlib>#include<algorithm>using namespace std;type原创 2017-05-05 08:30:24 · 419 阅读 · 0 评论 -
[线段树] Codeforces 794F Round #414 F. Leha and security system
线段树的简单应用?#include<cstdio>#include<cstdlib>#include<algorithm>using namespace std;typedef long long ll;inline char nc(){ static char buf[100000],*p1=buf,*p2=buf; return p1==p2&&(p2=(p1=buf)+frea原创 2017-05-23 21:10:33 · 501 阅读 · 0 评论 -
[线段树 瞎搞] BZOJ 4876 [Zjoi2017]线段树
这个题在考场上应该是能搞出来的 可是当时debuff太强 没敢想正解 写完了250行的暴力 正解呢 就是类似zkw线段树 我们从叶节点l−1l-1和r+1r+1一直走直到碰在一起 这样搞出了一条左链和一条右链 左链上的右兄弟和右链上的左兄弟就是所有要找的点 然后我们讨论下查询点uu和链底的lca的位置 进而可以知道链上所有点和uu的lca的深度和 这个细节有点多 不对拍很容易写挂 给考场上写挂的人原创 2017-05-02 21:37:58 · 842 阅读 · 0 评论 -
[扫描线 线段树] Codeforces 720D Russian Code Cup 2016 - Finals D. Slalom
注意这里的本质不同的含义 是左边和右边的障碍集合不同 那么我们要考虑怎么去重 我们要求能向右走就向右走 也就是说我们考虑把所有向左上的角都折叠起来然后就可以扫描线加线段树了 我们遇到一个障碍 就把能爬上来的都统计到障碍上面的那格 注意能爬需要一些判断#include<cstdio>#include<cstdlib>#include<algorithm>#include<set>usi原创 2017-04-17 09:38:34 · 579 阅读 · 0 评论 -
[spaly模拟 线段树] BZOJ 4825 [Hnoi2017]单旋
发现旋最小值到根 最小值深度变为1 他的右子树深度不变 其他都加1 旋最大值类似 这个只要线段树就好了 怎么求子树 看他的father 插入操作 找出前驱和后继 一定是祖先子孙关系 新点往深度大的下面挂#include<cstdio>#include<cstdlib>#include<algorithm>#include<set>using namespace std;inline ch原创 2017-04-20 06:50:48 · 1058 阅读 · 0 评论 -
[扫描线 线段树] BZOJ 4422 [Cerc2015]Cow Confinement
好题 但是懒得写题解 最近特别懒#include<cstdio>#include<cstdlib>#include<algorithm>#include<set>using namespace std;inline char nc(){ static char buf[100000],*p1=buf,*p2=buf; return p1==p2&&(p2=(p1=buf)+frea原创 2017-04-13 17:27:45 · 597 阅读 · 0 评论 -
[LCT维护最小生成树 || CDQ分治 || 线段树 并查集 dfs树] Codeforces 603E #334 (Div. 1) E. Pastoral Oddities
这是个好题啊 这种数据结构题和dfs树有什么关系呢 唯一的关系就是一个联通块当且仅当有偶数个点时能满足存在边集的一个子集每个点度数为奇数或者更一般的结论 当一个联通块中每个点的度数奇偶性要求之和是偶数 那么存在然后我们就转化为一些边使得每个联通块为偶数这个出题人的标算我没看懂啊 LCT在线维护最小生成树?http://codeforces.com/blog/entry/21原创 2017-01-04 16:45:31 · 1348 阅读 · 0 评论 -
[树上LIS 线段树合并] Codeforces 490F #279 (Div. 2) F. Treeland Tour
这道题数据好小啊 那么就可以暴力DP了这里有nlog2n的做法我们想一条链可以在他的LCA处统计每个点 我们对于以每个子树中的权值结尾的LIS LDS记录在线段树里我们可以向上合并线段树 答案在合并的时候更新就好了用 这一棵左儿子的lis和那一颗右儿子的lds 与 这一棵左儿子的lds和那一颗右儿子的lis 更新答案#include#include#includ原创 2016-12-26 15:01:59 · 1209 阅读 · 0 评论 -
[权值线段树套kd树 替罪羊式重构] BZOJ 4605 崂山白花蛇草水
就是个树套树就是claris的剪枝好神ORZ#include#include#include#includeusing namespace std;typedef long long ll; inline char nc(){ static char buf[100000],*p1=buf,*p2=buf; if (p1==p2) { p2=(p1=buf)+f原创 2016-05-29 21:26:23 · 1223 阅读 · 0 评论 -
[整体二分 树状数组套线段树] BZOJ 2674 Attack
大暴力啊 96s+卡过 //本地明明44s+//要了数据才知道相对顶点可以不是左下和右上#include#include#includeusing namespace std;inline char nc(){ static char buf[100000],*p1=buf,*p2=buf; if (p1==p2) { p2=(p1=buf)+frea原创 2016-06-06 18:22:48 · 671 阅读 · 0 评论 -
[树链剖分 线段树 标记永久化] BZOJ 4515 [Sdoi2016]游戏
想到了维护 ax+b 但不知道怎么修改 然后就听说了标记永久化 对于两个直线方程 把决定范围小的下放到子树中树链剖分两个log,标记一次最多下推log层三个log复杂度好虚#include#include#include#includeusing namespace std;inline char nc(){ static char buf[100000],原创 2016-04-22 10:26:43 · 887 阅读 · 0 评论