
线段树
bestFy
世界上最最最渣的oier.
展开
-
poj2828 Buy Tickets
题面在这里 题目大意: 有一个队列,初始时为空。有nn个人,n<=200000n<=200000,有一个想去的位置和价值,每个人会依次将这个价值插入到它想去的位置上。这nn个人都插入队列后,输出这个队列。做法: 我们维护一个线段树,每个节点表示这个区间内剩下还有几个空位,初始时线段树每个节点值就等于区间长度。 考虑逆序操作。从nn~11枚举,插入时询问线段树左儿子剩下的空位够不够,如果够的就原创 2017-12-08 12:22:53 · 235 阅读 · 0 评论 -
codeforces786B - Legacy
题面在这里题意:三种操作: 1.给a->b加一条边 2.给a->[b,c]分别加一条权值相同的边 3.给[a,b]->c分别加一条权值相同的边 然后问一个点到其他点的最短路做法:考虑在线段树上加边 一个点对应一个区间,就把那个点和那个区间所对应的线段树节点编号加边 然后线段树上父亲和儿子再分别连一条权值为0的边 然后就可以直接跑最短路了 好妙啊。代码:/***************原创 2018-01-04 08:22:39 · 360 阅读 · 0 评论 -
Codecraft-18 and Codeforces Round #458 (Div. 1 + Div. 2, combined)
比赛链接qaq这场比赛rating暴涨(小号)A. Perfect Squares题意:求最大的不是完全平方数的数。做法:直接从大到小排序即可。有一个很有趣的东西。。 就是这道题是有负数的,按理来讲是要判一下的因为负数没法sqrt。 但是我没判也可以过。。。 我后来发现cf的评测机好像sqrt一个负数会返回-2147483647,然后-21474836原创 2018-01-22 00:41:49 · 386 阅读 · 0 评论 -
bzoj4653: [Noi2016]区间
题面在这里题意:给出一堆区间,要你选出m个区间使得至少一个点都被覆盖,并且此时花费的代价是最长的区间长减去最短的区间长。 问最小的代价。做法:我们考虑一中区间的入场顺序,按照长度从小到大。 我们选出的区间肯定是连续的一段,于是我们用两个指针维护开头和结尾。 进来一段区间,就在线段树上把这一段加一,然后假如某一时刻,有一个点到达了m,就说明这连续一段的区间是可行的就可以原创 2018-01-05 11:11:42 · 255 阅读 · 0 评论 -
bzoj3038: 上帝造题的七分钟2
题面在这里题意:给一个序列,两种操作: 1. 区间开平方(下取整) 2. 区间求和做法:有一个性质就是,一个数不停开平方最多开log次就会变成1. 所以我们可以对区间保存一个tag表示这个区间有没有不是0或1的数,如果区间全是0或1就不用往下更新。 然后大概就可以log^2了吧qaqaq。易错点:注意开long long。我原来a[]没开long lon原创 2018-01-05 16:15:20 · 375 阅读 · 0 评论 -
hdu5381 The sum of gcd
题面在这里题意:给一个序列,然后m次询问。 每次询问一个区间[l,r]中所有子区间的gcd之和。做法:这个题是nowcoder的比赛题,Wannafly挑战赛7的E。 (然后被人找到了原题qaq。。 (一开始不会,从某个大佬口中一点点套出来的= =(果然大佬讲题都讲得飞快啊…我们考虑把询问离线。 对于每一个右端点,维护它左端点的答案。 于是我们从左往右枚举i,原创 2018-01-06 19:22:02 · 355 阅读 · 0 评论 -
loj#6208. 树上询问
题面在这里题意:给一棵树,三种操作: 1.add(x,d),给x到根路径上的点的ki += d 2.mul(x,d),给x到根路径上的点的ti += ki*d 3.询问一个点的ti值做法:树链剖分以后就变成一道线段树好题了qaq 我们考虑在线段树里维护一个tag(a,b,c),ti值即为a*b+c。 这里的a相当于ki。 对于2操作,我们直接b+=d就可以。原创 2018-01-07 22:51:20 · 607 阅读 · 0 评论 -
CC FIBTREE Fibonacci Numbers on Tree
题面在这里题意:给一棵树,有4种操作: 1.询问以x为根时y子树内的点权和。 2.询问x~y链上的点权和。 3.将x~y这条链展开,第i个点加上fibifib_i,其中fibifib_i表示斐波那契第i项,fib1=fib2=1fib_1 = fib_2 = 1。 4.恢复到第x个操作时的状态。 本题强制在线。做法:首先fibi=15√×((1+5√2)i−(1−原创 2017-12-28 11:28:34 · 337 阅读 · 0 评论 -
bzoj3083: 遥远的国度
题面在这里题意:给一棵树,每个点上有点权。 三种操作: 1.换根 2.链覆盖 3.以当前的根查询某子树内的最小值做法:当然不用真的去换根= = 可以直接令任意一点为根,比如1。 发现一条链是不会发生改变的,于是链覆盖操作可以直接树剖+线段树修改。 对于查询操作,我们分类讨论。 1.假如当前根和x相同,就直接取整棵树的最小值。 2.假如当前根在x的子树(以1原创 2018-01-10 14:58:39 · 351 阅读 · 0 评论 -
bzoj4388: JOI2012 invitation(线段树+堆)
题面在这里 代码题。。题意有 nnn 个男生, mmm 个女生。给出 kkk 条关系,每个关系形如 ai,bi,ci,di,tiai,bi,ci,di,tia_i,b_i,c_i,d_i,t_i ,表示 [ai,bi][ai,bi][a_i,b_i] 的男生和 [ci,di][ci,di][c_i,d_i] 的女生是好朋友,幸福指数为 titit_i。现在选择了一个男生 CCC 加入...原创 2018-03-13 15:14:52 · 343 阅读 · 0 评论 -
uoj#295. 【ZJOI2017】线段树(树上倍增)
先放代码,日后更。============================2018.3.21UPD============================ 题面在这里做法首先需要了解zkw线段树的操作过程。(不懂的百度一下) 大概就是从两个叶节点开始,维护两个指针,一个指向lll左边一位,一个指向rrr右边一位,不停向上跳。然后模仿这个过程同样在这个广义线段树上操作,画一下图可以发...原创 2018-03-14 12:05:48 · 386 阅读 · 0 评论 -
loj#2251. 「ZJOI2017」树状数组(二维数点,树套树维护概率)
先放代码,日后更。(*2)===========================2018.3.21UPD=========================== 题面在这里做法容易发现只要将query的l−1,rl−1,rl-1,r改成r+1,lr+1,lr+1,l就是正确的了。所以最后答案之和l−1,rl−1,rl-1,r这两个点的奇偶性是否相同有关。问题转化为维护两个位置的奇偶性相...原创 2018-03-14 13:53:13 · 1161 阅读 · 0 评论 -
bzoj4999: 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偷懒。。。代码:/*****************************************原创 2018-01-03 20:58:44 · 280 阅读 · 0 评论 -
bzoj4373: 算术天才⑨与等差数列
题面在这里题意:给一个序列 每次会给出询问l,r,k,问区间[l,r]内的数从小到大排序后能否形成公差为k的等差数列。 当然还会不断修改其中的某一项。做法:吐槽一下= =辣鸡码农。。。一个区间要满足能成公差为k的等差数列,对于k=0和l=r的特判, 其余需要满足3个条件。 1.区间max-min = (r-l)*k 2.区间任意相邻两数差的绝对值的gcd能被k整除 3.区间没有相同的数然原创 2018-01-03 20:09:20 · 409 阅读 · 0 评论 -
bzoj3196: Tyvj 1730 二逼平衡树
题面在这里我去树套树真**丧心病狂… 神tm6KB代码,代码总长233行也是醉了。 做法: 额没什么好说的就是树套树的裸题。。自行体会。/************************************************************* Problem: bzoj 3196 Tyvj 1730 二逼平衡树 User: fengyuan Lan原创 2017-12-07 21:01:49 · 274 阅读 · 0 评论 -
poj3237 Tree
题面在这里题目大意:有一棵树,要求支持树上单点修改,链取反(相反数),询问链上最大边权。做法:额....树剖裸题。维护一个线段树,打tag表示取不取反,然后线段树里要维护最大的和最小的值mx[o]和mi[o],更新的时候就是:swap(mx[o], mi[o]); mx[o] = -mx[o]; mi[o] = -mi[o]。然后先欣赏一下我的艰辛历程emmmm原创 2017-12-04 23:26:15 · 227 阅读 · 0 评论 -
bzoj1036: [ZJOI2008]树的统计Count
题面在这里树链裸题。。直接上代码qwq/************************************************************* Problem: bzoj 1036 [ZJOI2008]树的统计Count User: fengyuan Language: C++ Result: Accepted Time: 2388 ms Mem原创 2017-11-18 21:31:55 · 290 阅读 · 0 评论 -
bzoj2243: [SDOI2011]染色
题面在这里做法:树剖,就是线段树上要做点文章。要维护区间左端和右端的颜色,要打覆盖标记。合并的时候注意相同颜色答案要减一。/************************************************************* Problem: bzoj2243 [SDOI2011]染色 User: fengyuan Language: C++原创 2017-12-05 01:42:31 · 242 阅读 · 0 评论 -
poj2763 Housewife Wind
题面在这里题目大意:有一棵树,每条边有边权,一个人初始在s点。现在有两种操作,一是修改某条边的边权,二是询问这个人走到x点经过的边权总和,并移动到x点。做法:树剖。线段树维护区间和。(第一次树剖一次过qwq太感动了)/************************************************************* Problem: p原创 2017-12-05 18:13:47 · 1195 阅读 · 0 评论 -
bzoj4034: [HAOI2015]树上操作
题面在这里做法:树剖。线段树维护区间和,打lazy标记。其中子树加就是在dfs序上in[x]到out[x]一段加。/************************************************************* Problem: bzoj 4034 [HAOI2015]树上操作 User: fengyuan Language: C++ R原创 2017-12-05 20:42:54 · 298 阅读 · 0 评论 -
bzoj3626: [LNOI2014]LCA
题面在这里做法:首先说明以下都是以1为根的,点的编号是1~n。考虑最暴力的做法:对于一个询问l, r, z,将1~z的点全部打标记,枚举l~r之间的点u,从1~u的路上找到第一个打标记的点,答案就加上这个点的深度。然后稍微转化一下,假如把1~z的点权+1,然后对于l~r之间的点u,询问1~u之间的点权和,答案加上这个和。(正确性显然)再转化,我们把l~r之间的点u,1~u上点权原创 2017-12-05 23:21:56 · 262 阅读 · 0 评论 -
bzoj3531: [Sdoi2014]旅行
题面在这里 做法: 树剖+线段树动态开点。 容易想到对每个宗教建一棵线段树,不过空间限制不够,所以需要动态开点。别的都和正常树剖一样。代码如下:/************************************************************* Problem: bzoj 3531 [Sdoi2014]旅行 User: fengyuan Lang原创 2017-12-06 13:01:17 · 251 阅读 · 0 评论 -
codeforces834D - The Bakery
题面在这里题目大意:给一个长度为n的序列(n DP+线段树。先设方程:f[i][j][k]表示前i个数,分成j个连续子序列,最后一个序列从k开始的最大价值和。两个转移:① 第i个和最后一个序列合并。如果k~i-1之间没有出现a[i],那么f[i][j][k] = f[i-1][j][k]+1.② 第i个作为新的一个序列的开始。在f[i-1][j-1][p]原创 2017-12-02 00:13:18 · 419 阅读 · 0 评论 -
bzoj2325: [ZJOI2011]道馆之战
题面在这里 题目大意: 这题题目太长了就简单说一下题意。 给一棵树,每个节点分为两个区域A,B,在树上一个节点的某个区域,可以走到相邻节点的同一个区域,或同一个节点的另一个区域。每个区域内有两种状态,’.’表示冰,’#’表示障碍(障碍不能通过),给一些查询u, v,询问从u走到v能经过的最多冰的数量。同时还有一些修改操作,将某一点两个区域修改为s(s是长度为2的字符串)。做法: 这题花了我一原创 2017-12-06 17:57:03 · 332 阅读 · 0 评论 -
bzoj3862: Little Devil I
题面在这里 题目大意: 给一棵树,每条边有黑白两种颜色。有3种操作:一条链上的边的颜色取反(黑->白,白->黑);与一条链相邻的边的颜色取反,相邻就是指只有一个点在链上的边;询问某条链上黑边的数量。开始时边的颜色都是白。做法: 1操作和3操作就是普通的树剖+线段树,很容易维护。 主要是2操作。 我们考虑维护两棵线段树,T[0]T[0]维护正常的边修改,T[1]T[1]是辅助用的,当原创 2017-12-07 11:17:10 · 318 阅读 · 2 评论 -
bzoj3110: [Zjoi2013]K大数查询
题面在这里题意:有N个位置,M个操作。操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c,如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是多少。做法:权值线段树套区间线段树。呐应该很好理解。 我的第二棵树套树= =(第一棵是二逼平衡树)代码:/*******************************************原创 2017-12-31 23:44:46 · 283 阅读 · 0 评论 -
loj#2319. 「NOIP2017」列队(线段树+二分)
题面在这里 突然来填这个noip坑。顺便记一下一个可怕的错误。做法动态开点线段树+二分即可。 主要思想就是将题意转化为删除+插入操作,删除打1的标记。代码=> 用 while (q--) 的时候一定要留心看下下面有没有用到q =_=#include<bits/stdc++.h>#define rep(i,x,y) for (int i=(x)...原创 2018-04-27 08:47:04 · 368 阅读 · 0 评论