线段树
fyc_kabuto
一个蒟蒻程序员
展开
-
3155: Preprefix sum
传说可以用树状数组,不过因为本人比较菜,于是上无脑差分数组+线段树。容易发现,当一个数i增加x时,会使前缀和的前缀和j(j>=i)增加(j-i+1)*x。那么可以想象成i~n段加x,i+1~n段加x,i+2~n段加x……。那么用差分数组就可以直接改i~n,然后可以求前缀和求答案。(前缀和的前缀和的差分前缀和?有点绕)具体还是代码吧。语文死的早。code:#include#in原创 2017-07-11 10:11:31 · 372 阅读 · 0 评论 -
bzoj 1396: 识别子串
题意:给出一个字符串,对于每一个位置,求出最短的包含它的只在串中出现一次的子串长度。题解:建出sam,然后处理right集合为1的串。 然后线段树维护两个东西,一个以它为左端点,最靠左的合法右端点。 一个是直接包含的答案。 code:#include<cstdio>#include<cstdlib>#include<cstring>...原创 2018-03-19 20:54:31 · 234 阅读 · 0 评论 -
bzoj 2957: 楼房重建
题意: 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房。每天,这片工地上的房子拆了又建、建了又拆。他经常无聊地看着窗外发呆,数自己能够看到多少栋房子。 为了简化问题,我们考虑这些事件发生在一个二维平面上。小A在平面上(0,0)点的位置,第i栋楼房可以用一条连接(i,0)和(i,Hi)的线段表示,其中Hi为第i栋楼房的高度。如果这栋楼房上任何一个高度大于0的点与(0,0)的连线没有...原创 2018-04-21 10:00:20 · 141 阅读 · 0 评论 -
loj 2495. 「AHOI / HNOI2018」转盘
题意:在一个环形转盘上,第iii个物品将在TiTiT_i时刻出现。 那可以任选起点,每一个单位时间至多前进一格,问捡起所有物品最小时间。题解:显然有一种最优解是在某个时刻从某个点出发,一步不停的走一圈。 一波分析: 考虑枚举jjj,需要找最小满足条件的iii。也就是对于每一个jjj,找到最小iii的满足iii位置的后缀最大值为 xjxjx_j,最后答案取minminmin。 ...原创 2018-04-21 10:11:42 · 512 阅读 · 0 评论 -
codeforces 1017G. The Tree
题意:给一颗一开始全是白点的树,支持三个操作: 1:将某一个点改成白点,假如已经是白点,则对儿子进行该操作。 2:将一颗子树改成白色 3:询问某个点的颜色题解:显然是在要操作的点上打上标记。 关键是要设计一种有用的标记,比赛时sb,没有想到可以用后缀和…… 一开始整棵树都是-1,对于一操作,就在该点上+1,那么一个点上是黑点当前仅当它到根的路径的最大后缀和&gt;=0。 2...原创 2018-08-09 14:57:25 · 519 阅读 · 0 评论 -
hdu 6315 Naive Operations
题意:给一个排列bbb,要求维护一个数列支持: 1:区间加 2:求∑ri=l⌊aibi⌋∑i=lr⌊aibi⌋\sum_{i=l}^{r} \lfloor \frac{a_i}{b_i}\rfloor题解:考虑ans的上界,即每次add都是1,n,ans=nlognans=nlognans=nlogn 也就是说,只有nlognnlognnlogn此操作是有效的。 所以线段树暴力...原创 2018-08-06 15:41:27 · 177 阅读 · 0 评论 -
bzoj 4345: [POI2016]Korale
题意:有n个带标号的珠子,第i个珠子的价值为a[i]。现在你可以选择若干个珠子组成项链(也可以一个都不选),项链的价值为所有珠子的价值和。现在给所有可能的项链排序,先按权值从小到大排序,对于权值相同的,根据所用珠子集合的标号的字典序从小到大排序。请输出第k小的项链的价值,以及所用的珠子集合。题解:很久以前做过,完全忘了,于是有不会做…… 先将那个值计算出来,考虑爆搜,状态就是(S...原创 2018-09-13 21:42:21 · 235 阅读 · 0 评论 -
codeforces 543E. Listening to Music
题解每个线段树节点需要保存四个值,ls,rs,min,tag由于空间不够 所以把他们压缩成一个unsinged long longt[x] = (ls * N + rs) * T + val + tagt[x] % T 即可得到val + tag, ls = t[x] / T / N, rs = t[x] / T % N进行标记永久化过后可以用左右儿子的值解出自己的val,再解出tag...转载 2018-12-27 19:48:58 · 268 阅读 · 2 评论 -
AtCoder Regular Contest 068E - Frequency
题意:给出mmm个区间,对每个1≤i≤n1 \le i\le n1≤i≤n,求出又对少个区间至少含有一个他的倍数。题解:为什么网上的都是反着做呀,正着做也不难啊像我这种sb肯定不会反着做啦枚举i,暴力跳,考虑x−&amp;amp;gt;x+ix-&amp;amp;gt;x+ix−&amp;gt;x+i答案增加了多少,也就是说在x之前一定没有计入的区间有多少,直接对每个xxx建主席树即可。举个栗子,当前有[1,...原创 2019-01-11 21:40:56 · 225 阅读 · 0 评论 -
3734: [Ontak2013]Miny
题意:一个平面内有N个地雷,分布在X轴上。每个地雷爆炸后影响的范围是一个贺。在这圆内的地雷也会引爆。现在告诉你每个地雷所在坐标Xi及爆炸半径Ri。请问:这些雷中任一个被引爆后一共会有多少个雷爆炸,注意爆炸是会引起连锁反应的。题解:显然是线段树优化建图+拓扑。然而,因为懒,random_shuffle可以水过code:#include<cmath>#include<...原创 2019-01-16 20:49:10 · 492 阅读 · 0 评论 -
bzoj 4345: [POI2016]Korale
堆+贪心+线段树原创 2017-11-05 14:21:39 · 346 阅读 · 0 评论 -
bzoj 4538: [Hnoi2016]网络
线段树套堆原创 2017-10-16 16:36:34 · 258 阅读 · 0 评论 -
3196: Tyvj 1730 二逼平衡树
题目比较简洁:您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:1.查询k在区间内的排名2.查询区间内排名为k的值3.修改某一位值上的数值4.查询k在区间内的前驱(前驱定义为小于x,且最大的数)5.查询k在区间内的后继(后继定义为大于x,且最小的数)又有区间,又有排名,所以明显是树套树了,反正我写了区间线段树套平衡树。相当于在每个原创 2017-07-13 07:58:08 · 233 阅读 · 0 评论 -
3110: [Zjoi2013]K大数查询
题目大意,带该段的区间第k大。注意,一个位置上可以有多个数的,更改操作是增加新数,而不是覆盖。备用知识:标记永久化点击打开链接(不用的话应该也可以,但空间会大)然后就上权值线段树套区间线段树。不修改的区间第k小是例题(类似二分),树套树可以解决修改的问题。我们可以c+n+1转正,然后把求区间第k大变成(len-k+1)小。答案再减回来就行了。要用long longc原创 2017-07-14 09:52:22 · 317 阅读 · 0 评论 -
bzoj 5016: [Snoi2017]一个简单的询问
题意:求∑maxx=0get(l1,r1,x)∗get(l2,r2,x)\sum^{max}_{x=0}get(l1,r1,x)*get(l2,r2,x)题解:分块+线段树。 一开始傻傻的想分颜色块,然后被ozy大佬D飞了。 按位置分块。 f[i][j]f[i][j]表示第i块,和1~j的答案。 那么对于第i块与l,r的答案,就是f[i][r]−f[i][l−1]f[i][r]-f[i][l原创 2017-09-05 13:34:40 · 555 阅读 · 2 评论 -
bzoj 5029: 贴小广告
题意:区间染色,询问颜色总数。题解:离散化区间+线段树,最后统计下叶子节点就好了。 code:#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<algorithm>using namespace std;struct node{ int a,num,s;}a[210010]原创 2017-09-06 13:54:21 · 371 阅读 · 0 评论 -
bzoj 5028: 小Z的加油店
题意:问区间中的数加加减减能组成的正整数最小数。题解:其实是ax+by+……+czax+by+……+cz的最小正整数值。 根据裴蜀定理,就是他们的gcd。 所以就成了维护区间gcd。 然而因为太弱,还是一脸蒙逼。 orz tkj大佬,要我差分后再做。 根据辗转相除法,差分后的gcd=原序的gcd。 于是只用求出序列第一个数和后面差分的gcd就可以了。 线段树维护。 code:#inc原创 2017-09-26 21:52:31 · 414 阅读 · 0 评论 -
bzoj 2257: [Jsoi2009]瓶子和燃料
题意:在n个数中选k个数,使他们gcd最大。题解:上面的模型转化用裴蜀定理。 我是这么想的,将所有数的因数取出来,插到线段树上,然后找最大的且值大于k的点。 感觉时间空间都要炸。 然而开小空间后跑的飞快。 可能是平均每个数的因数不多吧。 code:#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>原创 2017-09-26 21:58:01 · 339 阅读 · 0 评论 -
bzoj 4999: This Problem Is Too Simple!
题意:给您一颗树,每个节点有个初始值。 现在支持以下两种操作: 1. C i x(0<=x<2^31) 表示将i节点的值改为x。 2. Q i j x(0<=x<2^31) 表示询问i节点到j节点的路径上有多少个值为x的节点。题解:看到这种东西,首先想到的就是树剖了吧。 但假如对于每一种值都看一棵线段树,空间爆炸。 但动态开点就没问题了。 关于值比较大,用map就行了。 code:#i原创 2017-09-01 20:47:34 · 414 阅读 · 0 评论 -
bzoj 1835: [ZJOI2010]base 基站选址
题意:用最少代价,按题目要求覆盖所有点。题解:不怎么会做,orz状态表示,知道f[i][j]f[i][j]表示前i个,建j个塔i号点必建并且全部覆盖的最小代价。 因为只考虑i前的,所以统计答案就可以多加一个无限远的点,转移到那里就是答案了。 于是有f[i][j]=min(f[k][j−1]+cost(k,i))+c[i]f[i][j]=min(f[k][j-1]+cost(k,i))+c[i]原创 2017-09-21 08:44:11 · 317 阅读 · 0 评论 -
bzoj 4364: [IOI2014]wall砖墙
线段树好题原创 2017-10-01 16:09:37 · 287 阅读 · 0 评论 -
bzoj 4415: [Shoi2013]发牌
题意:约瑟夫问题。题解:约瑟夫问题…… 直接线段树,记录下当前在哪一个,在线段树上二分下第k大就好了。 因为没想好再打,代码丑。 code:#include<cstdio>#include<cstdlib>#include<iostream>#include<cstring>using namespace std;struct trnode{ int lc,rc,c;}tr原创 2017-10-06 16:38:30 · 289 阅读 · 0 评论 -
3133: [Baltic2013]ballmachine
题解:第一步,读懂题,可以看下discuss那么对每个球求出优先级,开个堆记录当前有什么空位再开个线段树记录每个点最上面的点的深度,倍增上去修改即可code:#include<queue>#include<vector>#include<cstdio>#include<cstdlib>#include<cstring>...原创 2019-01-30 09:36:41 · 286 阅读 · 0 评论