线段树
L_0_Forever_LF
一个热爱OI的OIer
展开
-
BZOJ4369: [IOI2015]teams分组
将一个人(A,B)视作一个二维平面上的点,则一个小组k可以看作是[0,k]x[k,+∞]的一个矩形 对于每个询问,我们从小到大处理k,每次将当前的可行区域内最低的那些点分配给k,对于不可行或之前取过的点的矩形区域,我们维护他们的拐点,这些拐点从左到右高度递减,用一个单调栈维护,查询矩形内点数可以用主席树 总复杂度O((n+s)logn)O((n+s)logn)O((n+s)logn)cod...原创 2018-06-18 21:48:36 · 620 阅读 · 0 评论 -
BZOJ4059: [Cerc2012]Non-boring sequences
右端点扫过去,用线段树每个左端点,区间内只出现一次的数的数目code:#include<set>#include<map>#include<deque>#include<queue>#include<stack>#include<cmath>#include<ctime>#include<bitset>#include<string>#include<vector>#includ原创 2017-12-06 21:18:34 · 300 阅读 · 0 评论 -
BZOJ4071: [Apio2015]巴邻旁之桥
在河同一边的可以不理他问题就是有若干个人在A侧l位置,要通过桥到B侧r位置 l< r 当K=1时发现答案就是所有l,r的中位数 因为ans=|p−l|+|p−r|ans=|p-l|+|p-r|(好有道理我怎么没发现qwq) 同时这启示我们(观察易得??qwq)当有两个桥时,每个人会选择更接近(l,r)中点的桥 所以我们将(l,r)按照中点排序后,两个桥将这些人分成了两部分,我们枚举这个分界原创 2017-12-06 20:55:34 · 421 阅读 · 0 评论 -
BZOJ3718: [PA2014]Parking
因为停车场无限长,贪心的想,肯定是先把堆在一起的车拆开,全部分散开,然后移到对应的位置再组合起来….(匮乏的语文表达能力,泥萌意会一下?所以求出初始状态和目标状态的排列顺序线段树找一下区间最大值判一下是否超过宽度就行了code:#include<set>#include<map>#include<deque>#include<queue>#include<stack>#include<cm原创 2017-12-15 09:51:13 · 337 阅读 · 0 评论 -
BZOJ3711: [PA2014]Druzyny
orz考虑dp,f[i]表示1~i至多分成几段,g[i]表示1~i分成f[i]段的方案数 转移的时候将c[i],d[i]的限制分开考虑 对于d[i]的限制,不难发现他有单调性,可以预处理L[i]表示L[i]~i-1的j满足d[i]的限制可以由j转移到i 然后考虑c[i]的限制,他没有单调性,于是对c进行分治 如果我们在处理[l,r]这一个区间,找出[l+1,r]内c的最大值的位置k,那么k左原创 2017-12-15 09:26:52 · 643 阅读 · 0 评论 -
BZOJ4539: [Hnoi2016]树
WA到哭qwq 插入的点本身就在模板树上时不用找子树内第k大qwq我们将每次插入的一棵子树看作一个块,那么在模板树上插入块,最后的大树会有n+m块 插入时如果接上去的父亲不在模板树上,二分找到接在哪一个块p上,再用主席树找p对应模板树的子树内第k大,从而找到接在块p对应模板树里的哪个节点fa上,算粗这个块的根到块p的根的距离作为这两个块之间的边权,顺便维护st表 询问时先在大树上跳块,直到跳到同原创 2017-12-04 21:04:49 · 327 阅读 · 0 评论 -
BZOJ4408: [Fjoi 2016]神秘数
考虑处理单组询问 一开始ans=1,每次统计<=ans的数的和sum,若sum>=ans,就用sum+1更新ans 最坏情况下,ans的更新是1,2,3,5,8….是斐波拉契数列 所以ans最多更新log次 用主席树资瓷统计区间<=ans数的和 每次询问log^2 总复杂度mlog^2code:#include<set>#include<map>#include<deque>#in原创 2017-12-04 10:11:06 · 512 阅读 · 0 评论 -
BZOJ3526: [Poi2014]Card
一开始没读懂题意以为操作之间互不影响….然后写了个长长的st表WA了..用a[i][0/1]代表第i个卡片的正反面,线段树上每个点维护一个v[0/1][0/1]表示这个区间左右卡片的状态,在这个状态下这个区间是否能合法code:#include<set>#include<map>#include<deque>#include<queue>#include<stack>#include<cm原创 2017-11-23 18:28:54 · 250 阅读 · 0 评论 -
BZOJ1135: [POI2009]Lyz
似乎是hall定理的经典模型贪心的想,对于人的任意一个集合,肯定编号是连续的l~r一段更容易使匹配不合法 写成柿子就是∑ri=lsi>(d+r−l+1)k\sum_{i=l}^rsi>(d+r-l+1)k 把l,r移项,令ci=si−kci=si-k 柿子可以化为∑ri=lci>dk\sum_{i=l}^rci>dk 用线段树维护序列里的最大连续子序列和判一下code:#include<se原创 2017-12-11 16:28:19 · 353 阅读 · 0 评论 -
BZOJ3862: Little Devil I
肯定是树剖做分析一下3种操作 1:翻转一条链,直接翻 2:翻转与一条链相邻的边 可以发现,与一条链相邻的边中,是与父亲相连的边只有顶端的那一条,这一条可以直接暴力翻转,然后我们重新定义与链相连的边是链上每个点和儿子相邻的边中不在链上的边 考虑链上每个点和儿子的边,按轻重分类,对于轻边,我们也不需要考虑他们,因为查询时遇到的轻边是log条的,我们可以对这个点打标记,查询时暴力查询每条轻边父亲的原创 2018-01-13 09:54:42 · 291 阅读 · 0 评论 -
BZOJ3867: Nice boat
每次区间改成一个数,或者所有>=x的数和一个数x取gcd 和一个数取gcd大概log次就取成1了 又有区间覆盖 线段树维护一下这个区间是不是全部相同,全部相同就一起改否则递归下去暴力改 复杂度大概是nlog^2的?code:#include#include#include#include#include#include#include#include#inclu原创 2018-01-15 21:45:22 · 214 阅读 · 0 评论 -
BZOJ3585: mex
实际这题只需要考虑<=n的值区间mex有两个经典做法,一个是莫队+对权值分块,另一个就是主席树 我们对1~i建立主席树,位置j维护1~i中,j最后一次出现的位置 查询l rl rl~r时,在第rrr棵主席树上找到第一个<l<l< l的值 O(nlogn)O(nlogn)O(nlogn)code:#include<set>#inc...原创 2018-05-07 11:01:40 · 323 阅读 · 0 评论 -
Codeforces 765F. Souvenirs
每次询问一个区间内任意两个数差值绝对值的最小值不妨考虑一个位置iii,他和哪些位置j(j&lt;i)j(j&lt;i)j(j< i)匹配可能更新区间的答案 这里只考虑a[i]&gt;a[j]a[i]&gt;a[j]a[i]>a[j]的情况,另一种同理 可能贡献的jjj一定是一个下降子,另外还有一个不那么显然的性质,就是真正有用的jjj序列的长度不超过log&nbsp;wlog&原创 2018-04-17 21:25:45 · 303 阅读 · 0 评论 -
hdu5634 BestCoder Round #73 (div.1) Rikka with Phi 解题报告
题意:给一个序列,3种操作,一个区间全部赋值为xxx,一个区间内的每个aiaia_i 变成 phi(ai)phi(ai)phi(a_i),询问一个区间的和题解:怎么说呢,这种每个数变成他的 phi()phi()phi() , 开根什么的,一般来说都是要一个个修改的,但是一个数 aiaia_i,你不断对他取phiphiphi,开根什么的,经过log2ailog2a...原创 2016-09-25 19:17:16 · 558 阅读 · 0 评论 -
Codeforces 815D. Karen and Cards
给出n张卡片,每张卡片有三个属性值ai,bi,ci,求对于n张卡片里的每张卡片都有至少2项属性值严格大于他的卡片有多少种官方题解写的非常吼呀qaq,图文并茂,非常建议直接去看官方题解Link 我简单的说一下吧 我们先考虑只有一张卡片的情况 枚举c,那么对于一个确定的c,我们可以画出一个函数图像f(a),横轴是a的值,f(a)代表满足有至少两项优于这张卡片的b的取值范围是 [f(a),bm...原创 2018-03-05 20:43:43 · 326 阅读 · 0 评论 -
BZOJ3946: 无聊的游戏
将初始字符串和添加的字符串按照添加顺序 逆序 拼成一个大串S,那么一个串可以被表示成S[l1~r1]+S[l2~r2]… 我们维护height[i]=LCP(s[i-1],s[i]),L~R的LCP=min{ height[L+1~R] } 每次在L~R前面添加一个串T时,L+1~R的height区间加|T|,height[L]和height[R+1]要重新计算,二分加hash计算 考虑怎么...原创 2018-03-18 19:44:37 · 583 阅读 · 2 评论 -
Codeforces 911G. Mass Change Queries
填坑计划 1/∞原创 2018-03-12 10:51:41 · 483 阅读 · 0 评论 -
BZOJ2434: [Noi2011]阿狸的打字机
阿狸的打字过程实际上是在建一个trie树,对这棵trie建立ac自动机的fail树后,问第x个串在第y个串中出现了多少次,相当于问y串有多少个前缀,在fail树中位于x的子树里 到这里其实好像离线一下就可以了?但还有另一种资瓷在线询问的做法 我们不可能对y串的每个前缀处理,因为这个trie树的建立可以让所有串的总长是n^2级别的 但其实在trie树上这样走造字符串,很多串有着很长的LCP,比...原创 2018-02-21 15:50:25 · 227 阅读 · 0 评论 -
BZOJ4017: 小Q的无敌异或
对于第一问求所有区间异或和的和,将二进制位拆位考虑,对于每一位,就是求有多少个区间这一位有奇数个1,这个东西可以dp[i][0/1]表示i为右端点的区间,有偶数/奇数个1的左端点个数 对于第二问求区间和的异或和 先拆位,二进制第k位为1相当于和在Mod 2k+1Mod\ 2^{k+1}下>=2k>=2^k 一种做法是用∑ri=la[i]=sum[r]−sum[l−1]\sum_{i=l}^r原创 2018-01-24 13:32:55 · 743 阅读 · 0 评论 -
BZOJ4515: [Sdoi2016]游戏
传送门(这篇写得比我好qwq s到t的链可以拆成两条纵链 令dis[x]表示x到根的距离 对于一条纵链上的一个点x,添加的数就可以看成 (dis[x]-dis[t])* k+b =dis[x]*k-dis[t]*k+b =k*dis[x]+B 很像直线的表达式y=kx+b 树剖,问题变成线段树维护多条直线在区间内的最小值 对于一条链,因为这个区间内的dis是递增的即x坐标递增,这个原创 2017-12-01 20:59:41 · 426 阅读 · 0 评论 -
ARC082 F - Sandglass
线段树维护每个开始的a,在当前时刻A沙漏内沙子数量 沙漏倒过来的时候就区间+/-,减操作的话,对0取max,加操作就对X取min 动态开点,打一个区间覆盖标记一个区间加标记code:#include<set>#include<map>#include<deque>#include<queue>#include<stack>#include<cmath>#include<ctime>原创 2017-10-03 22:15:52 · 670 阅读 · 0 评论 -
BZOJ4383: [POI2015]Pustynia
是个很裸的差分约束? 如果有限制x>y 可以连一条边x->y,-1 代表y<=x-1 即 x>y注意到k个数把区间划分成了k个区间,对于每个限制,新建一个点,k个特殊的数向其连边-1,它向k个区间连边0 线段树优化建图 建好图后如果不是DAG说明有负环,无解 否则是个DAG,令f[x]表示x最大能取到的值,dp f值 如果一个固定了值的位置,他的f值< 它的值,也无解code:#inc原创 2017-10-01 11:51:13 · 477 阅读 · 0 评论 -
BZOJ4662: Snow
这题有个很重要的性质,即扫地工的区间两两互不包含 因为按编号递增时,Li严格递增,所以Ri也严格递增 那么每次清扫一个区间时,影响到的扫地工的编号是连续的一段 只是这个还是不能直接区间改,因为清扫这个区间,对于不同的扫地工影响是不同的 具体来说,比如Li都在这个清扫区间的扫地工,因为Li的不同,扫完这个区间对他们清扫区间的减少是不同的,但是,扫完后,他们的Li就相同了,Ri同理 这说明了什原创 2017-04-26 09:15:33 · 543 阅读 · 0 评论 -
BZOJ4826: [Hnoi2017]影魔
为什么既2016hn的码农大战后2017的题还是这么考码力…第一天2题码力题对于区间里的数,他们两两之间有两种配对方式: 一种是当i,j之间的数的最大值< min(a[i],a[j])时,[i,j]这一对贡献p1 一种是当i,j之间的数的最大值在a[i],a[j]之间时,[i,j]这一对贡献p2不妨设a[i]< a[j](i有可能>j) 对于第一种配对,我们去枚举i,对于每个i,去找可以和他匹原创 2017-04-26 07:56:56 · 1679 阅读 · 0 评论 -
BZOJ2957: 楼房重建
楼房i被看见的条件是他和起点连线的斜率是1~i里最大的可以用线段树做 维护每个区间的ans,max 合并区间的时候, 左区间的ans是可以直接加的, 对于右区间,当左区间的max>右区间max时,整个区间被挡住,没有贡献 当左区间的max<右区间max时,需要递归下右区间找 递归过程中,带一个这个区间前方的斜率max, 当max<左子区间的max时,这个带下来的max对右子区间的贡献无原创 2017-04-23 20:35:25 · 486 阅读 · 0 评论 -
BZOJ3533: [Sdoi2014]向量集
首先化简一下柿子 ax1+by1>ax2+by2−>ax1+by1>ax2+by2-> a(x1−x2)>−b(y1−y2)−>a(x1-x2)>-b(y1-y2)-> 若b>0−>b>0-> −ab>y1−y2x1−x2-\dfrac{a}{b}>\dfrac{y1-y2}{x1-x2} 需要维护一个[l,r][l,r]的斜率递减的队列 若b<0−>b<0-> −ab<y1−y2x1原创 2017-03-30 19:42:33 · 626 阅读 · 0 评论 -
BZOJ3166: [Heoi2013]Alo
每个宝石找出他能产生贡献即他是最大值的区间,【左边的第二个比他大的+1~右边的第二个比他大的-1】 然后写个可持久化trie每个宝石算一下最大值就好了 找左右第二个比他大的可以按宝石的权值从大到小插入,在线段树上找左右code:#include<set>#include<map>#include<deque>#include<queue>#include<stack>#include<原创 2017-02-01 22:40:28 · 603 阅读 · 0 评论 -
BZOJ3165: [Heoi2013]Segment
所以题意已经告诉了这题是线段树?线段树每个节点维护覆盖区间的最上的线段,每次插入线段,对于一个被其完整覆盖的区间,如果这个线段与之前覆盖它的无交点取较上者,否则随便取一个,另一个传到两个孩子,询问就每层的线段比较一下复杂度:O(能过) 别打我我不想证也不太会证#include<set>#include<map>#include<deque>#include<queue>#include<s原创 2017-02-01 22:35:41 · 768 阅读 · 0 评论 -
BZOJ3207: 花神的嘲讽计划Ⅰ
最近不是很想写blog,但是不写的话很快就连自己做过什么都不记得了吧题意:一个序列,每次询问一段区间里含不含一个长度为K的子串,K的长度固定长度固定的话直接hash就好了呀,然后就变成问一段区间有没有一个数,嗯…..可以打线段树,莫队也不错 一开始hash用233还WA了,加了3个3就过了 莫队还是挺快的code(莫队):#include<set>#include<map>#include<原创 2016-11-13 16:10:36 · 835 阅读 · 0 评论 -
BZOJ4012: [HNOI2015]开店
询问颜色在[L,R][L,R]区间的点到一个点的距离和,强制在线这题有两个做法,一个是动态树分治我不会,另一个是树剖 算u,vu,v两点在树上的距离我们可以用u,vu,v到根的距离和减2倍LCA(u,v)LCA(u,v)到根的距离和,那对于多个vv的话,可以将每个vv到根的路径上每条边在那个线段树上加一下,∑LCA(u,v)\sum LCA(u,v)就是uu到根上路径上的和。 那么将这个做法推广原创 2016-10-24 19:40:11 · 593 阅读 · 0 评论 -
BZOJ3443: 装备合成
可以发现,装备的合成是一个树形结构 对于一次合成,新建一个点表示这两个装备合成后的装备,成为这两个装备的父亲(一定要新建因为要兹瓷询问某个装备被合成前的属性) 然后某个装备的某个属性就相当于问这个装备的子树中某个属性的最大值,线段树在dfs序上查找就行了,因为属性数不多,对每种属性开一棵线段树code:#include<set>#include<map>#include<deque>#in原创 2017-04-26 14:40:18 · 744 阅读 · 0 评论 -
BZOJ3306: 树
一开始随便找一个根建树 修改点权在dfs序上改 询问x的子树时,如果x是当前根p的父亲,设y为p的祖先中,x的孩子,那么x的子树就是整棵树除去y的子树范围,否则子树范围不变,在dfs序上找最小值code:#include<set>#include<map>#include<deque>#include<queue>#include<stack>#include<cmath>#incl原创 2017-04-26 16:46:28 · 455 阅读 · 0 评论 -
ARC080 E - Young Maids
要求串q的字典序最小,那我们倒着,考虑最后插入q开头的字符在p串中的位置x,y(x< y),发现x一定是奇数下标的最小值,y一定是x之后,偶数下标最小值 同时这次操作后,会将区间分为(l,x-1),(x+1,y-1),(y+1,r) 维护个堆,每次取出第一位最小的,将它分裂,找分裂区间的最小值再塞进去 找最小值可以线段树或rmq 注意当操作区间(l,r)的左端点l是偶数时,上文的奇偶会取反c原创 2017-10-08 11:30:22 · 482 阅读 · 0 评论 -
BZOJ4345: [POI2016]Korale
感觉..这道题好像和多校某题很像,当时那题我没做结果现在又不会做了..现将珠子按价值排序 我们用一个二元组(x,i)代表当前选的珠子和为x,最后一个珠子是第i个 它可以转移到(x-a[i]+a[i+1],i+1),(x+a[i+1],i+1),且这种转移方式能不重不漏的覆盖所有的情况 又因为每次转移,新的状态和一定不比原来小,所以我们从(a[1],1)开始转移k-1次一定能得到第k小的价值,复原创 2017-09-29 07:29:05 · 486 阅读 · 0 评论 -
codeforces 833E. Caramel Clouds
英文不好..不是很懂题解里提到的那颗treap是干嘛的,还有题解说的维护一棵树,子树里什么single最大的和x相邻什么的没太看懂他在说什么…..但是yy一下然后发现可以用线段树直接弄…因为最多消除两片云,可以发现当一个区域被两片云以上覆盖后不可能产生贡献, 令single[x]表示只被x覆盖的区域长度, cross[x][y]代表只被x和y覆盖的区域长度, opt[x]代表去掉的云一定含x,原创 2017-09-12 22:05:39 · 628 阅读 · 0 评论 -
codeforces 720D. Slalom
细节炸的好惨…根据只能向上或者向右走的性质,我们考虑一种朴素的做法 令f[i][j]表示走到第i列,第j行的路径数 这样做时间复杂度是O(nm)O(nm)的,而且会算重复一些路径,因为对于每个障碍的位置关系都相同的路径是视为同一路径的 先考虑怎么去重 每条路径,除非需要绕过障碍,否则我们都让他保持最低的高度,即贴着底线走,由于其只能向上或右走的性质,别的走法能走到的地方这样走也都能走到,且在原创 2017-09-20 20:52:21 · 420 阅读 · 0 评论 -
BZOJ1107: [POI2007]驾驶考试egz
这题做了好久,性质很早就推出来了,一直不敢打…感觉总有什么地方不对劲… 事实上并没有…只是我线段树都写挂…有n条向上的街道,每条街道上有些向左或向右的,通向相邻的街道的边,让你添加至多k条边,问最多有多少条街道能到达所有街道首先,注意到我们从某条路出发,只能向上、左、右走,不能向下 然后每条边只通向相邻的街道,不会跨越那么可以转化一下,把所有街道分成当前街道左边的,右边的,因为不能跨越,也不能向原创 2017-09-25 16:37:55 · 437 阅读 · 0 评论 -
bzoj4527: K-D-Sequence
先特判d=0的情况 然后对于d≠0: 若a[i]和a[i+1]的差不是d的倍数,即a[i]和a[i+1]在模d下不等,那么他们肯定不会在同一个kd串中,将中间断开 于是得到了若干个原串的子串数列中不能有相同的数(还是挺好处理的吧),下文的叙述省略了数列中有相同的数的处理因为每个串内的数在模d下相同,所以先将他们全部/d(这样方便处理) 因为l~r中没有相同的数,那么这个数列若要成为kd数列,原创 2017-05-07 14:40:04 · 582 阅读 · 0 评论 -
BZOJ3958: [WF2011]Mummy Madness
可以发现,你被抓住的时间满足二分性,因为若在时间x你被抓住了,那么对于任意时间y>x,木乃伊都一定能抓住你 那么二分这个时间,你能走到的地方是一个矩形,同时每个木乃伊能走到的地方也是一个矩形,扫描线扫一下,若整个矩形都被覆盖了就会被抓住code:#include<set>#include<map>#include<deque>#include<queue>#include<stack>#原创 2017-04-26 19:38:44 · 763 阅读 · 0 评论 -
BZOJ3307: 雨天的尾巴
线段树合并 在链的两端x,y各打上1个z的加标记,在LCA(x,y)打上1个z的减标记,在fa(LCA(x,y))打上1个z的减标记,每个节点和所有孩子的线段树合并就好了code:#include<set>#include<map>#include<deque>#include<queue>#include<stack>#include<cmath>#include<ctime>#i原创 2017-04-26 19:13:29 · 572 阅读 · 0 评论