线段树
Cyhlnj
这个作者很懒,什么都没留下…
展开
-
BZOJ5289: [Hnoi2018]排列
传送门第一步转化,令 q[p[i]]=iq[p[i]]=iq[p[i]]=i,那么题目变成:有一些 q[a[i]]&lt;q[i]q[a[i]]&lt;q[i]q[a[i]]<q[i] 的限制,qqq 必须为排列,求 max(∑i=1nw[i]q[i])max(\sum_{i=1}^{n}w[i]q[i])max(∑i=1nw[i]q[i])这个东西是可以建图的,i→...原创 2019-02-20 17:53:22 · 244 阅读 · 0 评论 -
Bzoj1835:[ZJOI2010]基站选址
Sol设f[i][j]f[i][j]f[i][j]表示钦定iii建基站,建了jjj个基站的最小代价 f[i][j]=max(f[l][j−1]+Σi−1t=l+1f[i][j]=max(f[l][j−1]+Σt=l+1i−1f[i][j]=max(f[l][j-1]+\Sigma_{t=l+1}^{i-1}不能影响到的村庄的w[t])+c[i]w[t])+c[i]w[t])+c[i]二分...原创 2018-03-21 21:38:24 · 206 阅读 · 0 评论 -
CF817F MEX Queries
题意维护一个010101串,一开始全部都是000 333种操作 1.1.1.把一个区间都变为111 2.2.2.把一个区间都变为000 3.3.3.把一个区间的所有数字翻转过来 每次操作完成之后询问区间最小的000的位置 l,r<=1018l,r<=1018l,rlazylazylazy 但这样会爆空间所以把区间离散化 注意要离散111,lll,rrr,l+1l...原创 2018-03-21 21:28:24 · 908 阅读 · 5 评论 -
Bzoj2957: 楼房重建
题目传送门Sol线段树,维护斜率单增的最高点和长度 更新,以下的都是指斜率 当前点的左儿子更新上来,右儿子递归如果右儿子的左儿子的最大值大于左儿子的 加上算出右儿子的右儿子的贡献(右儿子贡献减去右儿子的左儿子的贡献),递归右儿子的左儿子否则,递归右儿子的右儿子# include <bits/stdc++.h># define RG register...原创 2018-03-21 21:23:34 · 170 阅读 · 0 评论 -
NOIP2017:列队
Sol考场上: 这不是送505050吗,Q2Q2Q^2递推就好了 然后,怎么又送202020分??? wocwocwoc,只有半个小时了,顺利没调出来只有505050分 考后: 神TMTMTM一个大于号写成小于号。。。 202020分没了 TATTATTAT正解的一种nnn棵线段树维护每一行的前m−1m−...原创 2018-03-30 14:39:22 · 506 阅读 · 0 评论 -
Bzoj4552: [Tjoi2016&Heoi2016]排序
题目传送门Sol二分+线段树 巧妙啊我怎么就没想到 二分答案,把数分类,大于等于midmidmid的为111,小于的为000 相当于给010101序列排序,最后判断询问位置上是不是111 线段树+lazy覆盖# include <bits/stdc++.h># define RG register# define IL inline# define...原创 2018-02-25 15:19:18 · 187 阅读 · 0 评论 -
CF903G Yet Another Maxflow Problem
题面一张图分为两部分,左右都有nnn个节点, Ai−>Ai+1Ai−>Ai+1A_i->A_{i+1}连边,Bi−>Bi+1Bi−>Bi+1B_{i}->B_{i+1}连边,容量给出 有mmm对Ai−>BjAi−>BjA_i->B_j有边,容量给出 两种操作 1.修改某条Ai−>Ai+1Ai−>Ai+1A_i->A_{i+1}的边的容量 ...原创 2018-03-17 17:20:13 · 368 阅读 · 0 评论 -
CF833B The Bakery
题意将一个长度为nnn的序列分为kkk段 使得总价值最大 一段区间的价值表示为区间内不同数字的个数 n<=35000,k<=50n<=35000,k<=50nf[i][j]f[i][j]f[i][j] 表示前iii个数字分成jjj段的最大价值 则f[i][j]=maxf[i][j]=maxf[i][j] = max{f[l][j−1]+Query(l+1,i)...原创 2018-03-17 14:44:27 · 706 阅读 · 1 评论 -
UOJ#288:基础数据结构练习题
题面UOJSol玄学,不会势能分析 所以 维护区间最大最小值 把开根变成区间减法 如果最大值开根后的变化量和最小值的相等,就直接打个减法lazylazylazy# include <bits/stdc++.h># define RG register# define IL inline# define Fill(a, b) memset(a, b, s...原创 2018-03-16 15:58:21 · 218 阅读 · 0 评论 -
Bzoj2962: 序列操作
题面传送门Sol线段树,维护一个长度为202020的数组,每次合并时就是左右儿子做个卷积 区间加法 二项式展开 用lenlenlen表示区间长度,加的xxx的贡献组合数算一下就好了 看代码就知道了# include <bits/stdc++.h># define RG register# define IL inline# define Fill(a, b...原创 2018-03-21 21:43:15 · 227 阅读 · 0 评论 -
CF700E Cool Slogans
题意给出一个长度为 nnn 的字符串 s[1]s[1]s[1],由小写字母组成。定义一个字符串序列 s[1....k]s[1....k]s[1....k] ,满足性质:s[i]s[i]s[i] 在 s[i−1]s[i−1]s[i-1] (i≥2)(i≥2)(i \ge 2) 中出现至少两次(位置可重叠),问最大的 kkk 是多少,使得从 s[1]s[1]s[1] 开始到 s[k]s[k]s[k...原创 2018-06-12 15:37:17 · 279 阅读 · 0 评论 -
Luogu4433:[COCI2009-2010#1] ALADIN(类欧几里德算法)
先套用一个线段树维护离散化之后的区间的每一段的答案那么只要考虑怎么下面的东西即可∑i=1n(A×i&nbsp;mod&nbsp;B)\sum_{i=1}^{n}(A\times i \ mod \ B)i=1∑n(A×i&nbsp;mod&nbsp;B)拆开就是∑i=1nA×i−B×∑i=1n⌊A×iB⌋\sum_{i=1}^{n}A\times i-B\times \sum_{i=1}...原创 2018-11-06 16:59:21 · 320 阅读 · 0 评论 -
UOJ#410. 【IOI2018】会议
传送门首先可以设 f[l][r]f[l][r]f[l][r] 表示 [l,r][l,r][l,r] 的答案设 xxx 为区间 [l,r][l,r][l,r] 的最大值的位置,那么f[l][r]=min(f[l][x−1]+h[x]×(r−x+1),f[x+1][r]+h[x]×(x−l+1))f[l][r] = min(f[l][x-1]+h[x]\times (r-x+1),f[x+1][...原创 2019-02-01 10:49:58 · 377 阅读 · 0 评论 -
LOJ#6032. 「雅礼集训 2017 Day2」水箱
传送门首先可以有一个平方复杂度的 DPDPDP设 fi,jf_{i,j}fi,j 表示前面 iii 个小格,高度为 jjj 的最大答案令 hih_ihi 表示隔板 iii 的高度当 j≤hij\le h_ij≤hi 时,转移到 fi+1,k,k∈[0,hi]f_{i+1,k},k\in [0,h_i]fi+1,k,k∈[0,hi]否则 fi,j→fi+1,jf{i,j}\rig...原创 2019-01-24 21:58:43 · 356 阅读 · 0 评论 -
BZOJ3682: Phorni(后缀平衡树)
传送门后缀平衡树模板题用平衡树维护每一个后缀的排名关键在于查询两个后缀的大小可以用二分加hash,复杂度 log2nlog^2nlog2n 插入或者:每次前面插入一个字符,先比较两个后缀第一个字符的大小而后面的大小我们已经在平衡树上维护好了像这样分配权值给树上每个子树一个实数权值区间 [l,r][l,r][l,r],这个点权值为 mid=l+r2mid=\frac{l+r}{2...原创 2019-01-12 16:48:11 · 231 阅读 · 0 评论 -
UOJ#400. 【CTSC2018】暴力写挂
传送门看到要求两棵树的 lcalcalca 深度不太好操作考虑枚举第二棵树的 lcalcalca,这样剩下的都是只和第一棵树有关的而注意到 dis(x,y)=d(x)+d(y)−2d(lca(x,y))dis(x,y)=d(x)+d(y)-2d(lca(x,y))dis(x,y)=d(x)+d(y)−2d(lca(x,y))那么 d(x)+d(y)−d(lca(x,y))=12(dis(x...原创 2019-01-06 17:56:55 · 359 阅读 · 0 评论 -
UOJ#191. 【集训队互测2016】Unknown
传送门这个题目实际上可以建立出树,然后重链剖分维护一条链的凸包然后离线询问排序斜率做到 nlog2nnlog^2nnlog2n,或者点分治+平衡树也行但是这个题目卡空间,数组一不小心就爆了卡一卡也能过考虑其它空间常数小并且又好写的做法根据一般的二进制分组的方法,每次这个块满了就合并儿子的凸包这样显然不对,只要又删又加就假了我们换一种方法,每次这个块满了就合并线段树同一层前一个节点的儿...原创 2019-01-11 12:53:44 · 457 阅读 · 0 评论 -
UOJ#414. 【APIO2018】新家
传送门首先二分答案 midmidmid,问题变成求区间 [l−mid,r+mid][l-mid,r+mid][l−mid,r+mid] 在该年份的不同类型个数为 kkk关于年份的限制可以离线下来现在的问题就是区间数颜色,一个套路就是维护每个颜色的后继,即这个位置颜色的下一个位置那么,如果有 (−∞,l−mid](-\infty,l-mid](−∞,l−mid] 的某一个值大于 r+midr...原创 2019-01-11 09:02:59 · 292 阅读 · 0 评论 -
UOJ169. 【UR #11】元旦老人与数列
传送门考虑用 segment tree beatssegment~tree~beatssegment tree beats 那一套理论,维护区间最小值 mnmnmn 和严格次小值 sesese那么可以直接 mlog2nmlog^2nmlog2n 维护前三个操作考虑维护历史最小值,先维护历史最小标记写了写发现 maxmaxmax 那个修改不好操作对于...原创 2019-01-10 18:52:10 · 286 阅读 · 0 评论 -
UOJ46. 【清华集训2014】玄学
传送门Sol考虑对于操作时间建立线段树,二进制分组那么现在主要的问题就是怎么合并信息你发现一个性质,就是每个修改只会在整个区间内增加两个端点那么我们二进制分组可以得到每个区间内最多只有区间长度级别段,每一段的修改都是一样的那么可以直接一层层归并上来最后询问就是二分每一个线段树的节点的询问段即可修改复杂度 Θ(nlogn)\Theta(n log n)Θ(nlogn) 询问复杂度 Θ...原创 2018-12-08 19:14:55 · 408 阅读 · 0 评论 -
Bzoj3211: 花神游历各国
题面BzojSol暴力开根,一个数开根到小于等于111就不用管了,维护区间maxmaxmax,max<=1max<=1max原创 2018-02-23 11:49:41 · 197 阅读 · 0 评论 -
Bzoj1558: [JSOI2009]等差数列
题面传送门Sol线段树维护区间DPDPDP 差分,你会发现就是选一些区间,第一个值可以不一样 那么我们维护原数组左右端点是否选的情况,一共四种 注意差分数组只有n−1n−1n-1的长度,并且每个数维护的是两个相邻的原数组的数# include <bits/stdc++.h># define RG register# define IL inline# d...原创 2018-03-15 21:50:54 · 357 阅读 · 0 评论 -
Bzoj3730: 震波
题面戳我 Sol动态点分治: 建个点分树,每个节点开两颗线段树,以与该点的距离为下标,维护价值和 一棵树维护这个点的,一棵维护对上层重心的贡献然后。。 然后?直接暴力搞就行了注意常数优化我TLE了一遍,第二遍卡过去的# include # define RG register# define IL inline# define Fill(a, b原创 2018-01-13 15:44:24 · 412 阅读 · 0 评论 -
Bzoj4372: 烁烁的游戏
题面戳我Sol和bzoj震波那道题差不多 加上线段树标记永久化就好了# include # define RG register# define IL inline# define Fill(a, b) memset(a, b, sizeof(a))using namespace std;typedef long long ll;const int _(2e5 +原创 2018-01-13 16:32:48 · 287 阅读 · 0 评论 -
[SHOI2008]堵塞的交通traffic
这是一道毒瘤题 只要线段树维护一个矩形的四个点的连通性即可 合并时请想清楚,要大讨论一番 询问有可能存在跨区间的联通情况,只要把询问的区间分成[1,l],[l,r],[r,n]在大讨论一番即可 如果你不想讨论或者讨论出错,你可以使用并查集,每次开并查集更新,这样就不用大讨论一番了# include <bits/stdc++.h># define RG register# define I原创 2018-01-01 20:16:56 · 264 阅读 · 0 评论 -
Bzoj3626 [LNOI2014]LCA
先把问题简化,怎样求一个点x和y的lca的deep和 显然直接求LCA,但是这样的话,要求多个就不好叠加 于是可以用奇技淫巧:先把x到根的所有点打上标记,那么询问y到根的标记的个数即为答案,这样就可以叠加 所以对于询问,拆成[1,l-1], [1, r],排序后依次加点覆盖标记即可可以用树链剖分+线段树,或者Orz yyb大佬一样写LCT代码表示不想写LCT# include <bits/st原创 2017-12-31 20:26:06 · 242 阅读 · 0 评论 -
[TJOI2015]旅游
树链剖分+线段树 线段树维护max,min,左往右的最大差,右往左的最大差 求LCA时一定要注意方向# include <bits/stdc++.h># define RG register# define IL inline# define Fill(a, b) memset(a, b, sizeof(a))using namespace std;typedef long long原创 2017-12-30 17:47:27 · 241 阅读 · 0 评论 -
(jzoj snow的追寻)线段树维护树的直径
jzoj snow的追寻 DFS序上搞 合并暴力和,记录最长链和当前最远点,距离跑LCA# include <stdio.h># include <stdlib.h># include <iostream># include <algorithm># include <string.h># define IL inline# define RG register# define F原创 2017-12-09 11:20:32 · 426 阅读 · 0 评论 -
POJ - 2528
简单翻译n(n<=10000) 个人依次贴海报,给出每张海报所贴的范围li,ri(1<=li<=ri<=10000000) 。求出最后还能看见多少张海报。 Input 第一行: 样例个数T 第二行: 贴海报的人n 接下来n行: 每个人贴海报的范围 Output 对于每一个输入,输出最后可以看到的海报张数。下面这个图是样例解释原创 2017-07-20 17:02:47 · 443 阅读 · 0 评论 -
POJ - 2828
题意输入队伍长度n 接下来n行,a,b 表示b插在队伍的a处 求队伍最后的情况题解刚开始并不知道要用线段树,经大佬点悟,发现最后插入的位置就是对应的a。所以可以从后往前依次插入,每次的位置pos即找到一个位置pos使它前面空出pos个位置。然后我们就可以用线段树了。 常数巨大的丑陋代码# include <stdio.h># include <stdlib.h># include <ios原创 2017-07-20 20:18:40 · 280 阅读 · 0 评论 -
Bzoj1969: [Ahoi2005]LANE 航线规划
题面戳我Sol把询问反过来,变成加边,先加上边变成一棵树,之后每次加边就相当于去掉这两个点与这条边形成的环的代价,用树剖+线段树覆盖区间即可# include # define RG register# define IL inline# define Fill(a, b) memset(a, b, sizeof(a))using namespace std;ty原创 2018-01-15 08:10:55 · 294 阅读 · 0 评论 -
Bzoj 3196 二逼平衡树
树状数组套线段树(值域线段树)记得离散化# include # define IL inline# define RG register# define Fill(a, b) memset(a, b, sizeof(a))using namespace std;typedef long long ll;const int _(2e5 + 10), __(5e6 + 10), INF原创 2018-01-05 17:27:33 · 284 阅读 · 0 评论 -
Bzoj1901 Dynamic Ranking
动态区间第k小那么每个点开一棵线段树(主席树)再套一个树状数组在外面每次询问区间内的树的个数时 相当于进行了一次树状数组求区间和的操作,只是是把树状数组那个点看做主席树,对log棵主席树求区间和然后每次询问,修改时就是把log棵主席树同时跳到儿子,修改也是log棵时间复杂度O(nlogn*logn)空间复杂度O(nlogn*logn)# include <bits/stdc++.h># defi原创 2017-12-23 11:09:42 · 257 阅读 · 0 评论 -
Bzoj3110: [Zjoi2013]K大数查询
题面BzojSol整体二分 比较经典,练手题 每次的修改会影响一个区间,我用的是线段树覆盖# include # define RG register# define IL inline# define Fill(a, b) memset(a, b, sizeof(a))using namespace std;typedef long long ll;const原创 2018-02-06 18:30:41 · 285 阅读 · 0 评论 -
Bzoj4817:[SDOI2017]树点涂色
题面BzojSol做个转化 最开始都是虚边 操作111就是LCTLCTLCT里的AccessAccessAccess操作 求的就是路径上虚边的个数+1然后就好办了 用树链剖分+线段树来维护每个点到根虚边的个数的最大值 操作111:AccessAccessAccess时虚实边的转换,要把原来连的点的SplaySplaySplay的最左边的点在原树中的子树所有点+1,再把...原创 2018-02-10 10:35:18 · 264 阅读 · 0 评论 -
Bzoj4869: [Shoi2017]相逢是问候
题面传送门Sol摆定理 ab≡⎧⎩⎨⎪⎪ab%ϕ(p) gcd(a,p)=1ab gcd(a,p)≠1,bϕ(p)ab%ϕ(p)+ϕ(p) gcd(a,p)≠1,b≥ϕ(p) (mod p) a^b\equiv\begin{cases}a^{b\%\phi(p)}~~~~~~~~~~~gcd(a,p)原创 2018-01-19 22:39:54 · 470 阅读 · 0 评论 -
Luogu3676: 小清新数据结构题
题面传送门题解先来一发很显然的暴力维护两个数组,一个是子树的val和,一个是子树的val和的平方和 暴力更新,暴力查询就可以获得10分吐槽一波luogu的部分分# include # define RG register# define IL inline# define Fill(a, b) memset(a, b, sizeof(a))# define S原创 2018-01-18 21:23:58 · 312 阅读 · 0 评论 -
Bzoj4653: [Noi2016]区间
题目传送门Sol把区间按长度升序排序,双端点+离散化+线段树区间最大值线段树标记永久化美滋滋# include # define RG register# define IL inline# define Fill(a, b) memset(a, b, sizeof(a))using namespace std;typedef long long ll;cons原创 2018-01-17 21:36:55 · 228 阅读 · 0 评论 -
线段树标记永久化
前言对于树套树,主席树等使用到线段树的比较复杂的数据结构,如果区间修改的话,打标记后pushdown或者pushup是很难做到的完全不行吧 所以这个时候,一个神奇的东西诞生了。。。正题线段树标记永久化,维护一个标记,假设为cov,再维护一个sum 假设修改区间[ql, qr]全部加上v: 和平常一样,到这个区间后cov[x] += v 但是我们又不想pushup,怎么办? ...原创 2018-01-06 09:22:18 · 1062 阅读 · 0 评论 -
Bzoj 4551: [Tjoi2016&Heoi2016]树
题面戳我Sol每个被标记的点只会影响到它的子树,那么直接用线段树在dfn上搞 单点查询,区间修改# include # define RG register# define IL inline# define Fill(a, b) memset(a, b, sizeof(a))using namespace std;typedef long long ll;co原创 2018-01-16 14:55:55 · 265 阅读 · 0 评论