线段树
_beginend
这个作者很懒,什么都没留下…
展开
-
【NOI2020 命运】【线段树合并】
题意给一棵 nnn 个点的有根树和 mmm 条祖先-后代链,要求给每条边赋值 000 或 111,问有多少种方案满足每条链上至少有一条边的值为 111。n,m≤5∗105n,m\le 5*10^5n,m≤5∗105分析考虑容斥。强制让若干条链不满足,贡献就是链上的边只能取 000,其余边的值可以随便取的方案数,容斥系数为 (−1)k(-1)^k(−1)k,其中 kkk 为选择的链数量。树形dp。令 fi,jf_{i,j}fi,j 表示以 iii 为根的子树,从 iii 到深度为 jjj 的祖先路原创 2020-08-19 17:03:14 · 625 阅读 · 0 评论 -
【Comet OJ - Contest #15 E 栈的数据结构题】【离线+线段树】
题意有nnn个栈,编号为111到nnn,有以下三种操作:1、对编号在[l,r][l,r][l,r]中的每个栈执行push(v)push(v)push(v)操作。2、对编号为[l,r][l,r][l,r]中的每个栈执行pop()pop()pop()操作。3、查询某个栈中从栈顶开始第kkk个元素。n,q≤2∗105n,q\le2*10^5n,q≤2∗105分析注意到对于某个询问,找到在它...原创 2019-11-23 23:11:07 · 258 阅读 · 0 评论 -
bzoj 4552: [Tjoi2016&Heoi2016]排序 二分答案+线段树
题意:有一个n的某个排列,要求资瓷两个操作:0 l r表示将[l,r]这个区间按升序排序1 l r降序排序最后问位置q上的数是多少分析:这题题解好劲啊!!!首先二分一下答案(蒟蒻表示根本想不到)判断ans是否不小于mid若a[i]然后用线段树维护一下就好了代码:#include#include#include#include#incl原创 2016-08-30 18:54:05 · 427 阅读 · 0 评论 -
bzoj 1901: Zju2112 Dynamic Rankings 树状数组套线段树 cdq分治
题目传送门树套树一棵树状数组,每个节点上都是一棵权值线段树(不是可持久化线段树),线段树动态开节点。 然后每次查询的时候二分答案就好了。 时间复杂度O(nlog^3) 勉强水过……#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>using namespace原创 2016-10-23 20:16:33 · 509 阅读 · 0 评论 -
bzoj 3110: [Zjoi2013]K大数查询 线段树套线段树
Description有N个位置,M个操作。操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是多少。Input第一行N,M 接下来M行,每行形如1 a b c或2 a b cOutput输出每个询问的结果Sample Input2 51 1 2 11 1 2 22 1 1 22原创 2016-10-13 20:38:47 · 423 阅读 · 0 评论 -
bzoj 3832: [Poi2014]Rally 线段树+拓扑排序
题意给定一个N个点M条边的有向无环图,每条边长度都是1。请找到一个点,使得删掉这个点后剩余的图中的最长路径最短。 2<=N<=500 000,1<=M<=1 000 000分析这题好劲啊,根本想不到。设一个超级源点s和超级汇点t,从s向所有点连一条边,从每个点向t连一条边,那么原图的最长路就变成了s到t的最长路。 预处理处f[i]表示s到点i的最长路,g[i]表示点i到t的最长路,给每一条边设置原创 2016-11-08 19:09:30 · 417 阅读 · 0 评论 -
bzoj 1984: 月下“毛景树” 线段树+树链剖分
题意给出一棵n个节点的树,每条边都有权值,要求资瓷以下操作: Max x y表示查询x到y之间的最大权值 Cover x y z表示把x到y的权值赋为z Change x y表示把第x条边的权值变成y Add x y z表示把x到y的权值加上z n+m<=100000分析一眼树剖+线段树。 把边权下放到两端深度较大的那个点即可。 线段树维护两个标记和最大值。 注意两个点的lca不用处原创 2016-11-15 08:13:42 · 566 阅读 · 0 评论 -
bzoj 2141: 排队 树状数组套线段树
题目传送门分析树状数组套线段树。 对于每一次交换x和y的操作,先减去在交换之前x和y分别与a[x+1..y-1]产生了多少逆序对,再加上交换后x和y分别与a[x+1..y-1]产生了多少逆序对,然后再进行交换操作就好了。一开始的想法是线段树套线段树,但是很明显线段树各方面的指标都没有树状数组优秀,所以就果断改成了树状数组。貌似分块+二分或分块套树状数组或线段树套平衡树也是可做的,懒得打了。代码#i原创 2016-10-22 11:56:35 · 419 阅读 · 0 评论 -
bzoj 4719: [Noip2016]天天爱跑步 线段树合并
题意有一棵n个节点的树,每条边权为1,每个节点都会在某一个时间出现观察员且只会出现一次。现有m个玩家,给定每个玩家的起点,然后每个玩家会在时刻0从起点出发,沿着唯一的路径走向终点。问每个观察员分别可以看到多少个玩家。 n,m<=300000分析话说这真的是NOIPd1t2的难度吗?这不科学啊233333首先必须要想到的是对于每一个玩家的路径可以拆成两条,一条从起点到lca,另一条从lca往下一个节原创 2016-12-01 21:28:19 · 3209 阅读 · 0 评论 -
bzoj 2212: [Poi2011]Tree Rotations 线段树合并
题意现在有一棵二叉树,所有非叶子节点都有两个孩子。在每个叶子节点上有一个权值(有n个叶子节点,满足这些权值为1..n的一个排列)。可以任意交换每个非叶子节点的左右孩子。要求进行一系列交换,使得最终所有叶子节点的权值按照遍历序写出来,逆序对个数最少。 n<=200000分析对每个叶节点建立一棵线段树,然后每次合并的时候顺便求出交换孩子和不交换孩子的逆序对数,最后统计即可。记得开long long代码原创 2016-12-02 21:34:21 · 639 阅读 · 0 评论 -
codeforces 173E 组队 线段树+离线
题意Bsny所在的精灵社区有n个居民,每个居民有一定的地位和年龄,ri表示第i个人的地位,ai表示第i个人的年龄。 最近社区里要举行活动,要求几个人分成一个小组,小组中必须要有一个队长,要成为队长有这样的条件: 1、队长在小组中的地位应该是最高的(可以并列第一); 2、小组中其他成员的年龄和队长的年龄差距不能超过K。 有些人想和自己亲密的人组在同一个小组,同时希望所在的小组人越多越好。比如x原创 2017-01-14 20:37:18 · 458 阅读 · 0 评论 -
bzoj 2752: [HAOI2012]高速公路(road) 线段树
题意有一条链,要求资磁两个操作 C l r v 表示将第l个收费站到第r个收费站之间的所有道路的通行费全部增加v Q l r 表示对于给定的l,r,要求回答对于给定的l,r(l < r),在第l个到第r个收费站里等概率随机取出两个不同的收费站a和b,那么从a行驶到b将期望花费多少费用呢? n,q<=100000分析把边变成点,那么答案就是∑val[i]∗(i−l+1)∗(r−i+1)(r−原创 2017-02-13 19:38:46 · 430 阅读 · 0 评论 -
bzoj 3683: Falsita 树链剖分+线段树
题意给出一棵有根树,一开始每个节点都有一个权值。要求资瓷三个操作: S x delta节点x的权值增加delta M x delta以x为根的子树的所有节点的权值增加delta Q x询问(∑lca(p,q)==xv[p]+v[q])/(∑lca(p,q)==x)(\sum_{lca(p,q)==x}v[p]+v[q])/(\sum lca(p,q)==x) n,m<=300000分析一开始原创 2017-02-15 20:41:52 · 1413 阅读 · 0 评论 -
bzoj 3995: [SDOI2015]道路修建 线段树
题意给出一个2行n列的图,只有相邻的点有连边,要求资瓷两个操作: Q l r查询第l列到第r列的最小生成树 C x1 y1 x2 y2 w修改边权 n,m<=60000,w<=10000分析第一想法是lct来xjb维护一下,发现不会做。。。想了一下,想到了一个用set维护待修改莫队的方法。。。然后又想了一下,想到了一个n*m的做法。。。 毕竟太弱。。。 直接线段树维护即可。 考虑合并区间原创 2017-03-29 21:49:35 · 630 阅读 · 0 评论 -
bzoj 4538: [Hnoi2016]网络 树链剖分+线段树
题意给出一棵树,要求资瓷m个操作: 0 x y v表示点x和点y有一个交互请求,权值为v 1 t表示第t个操作的请求被取消 2 x表示询问没有覆盖x的交互请求的最大权值 n<=100000,m<=200000分析一开始没有看到删除操作,以为是一道傻逼题。。。首先树剖,然后对于一个请求,显然其能影响到的点为不在该链上的点,那么就把区间取反,然后插入即可。但由于有删除操作,于是我们在线段树的每个原创 2017-03-13 21:10:45 · 337 阅读 · 0 评论 -
bzoj 4515: [Sdoi2016]游戏 树链剖分+线段树
题意给出一棵树,边有边权,一开始每个节点上都有一个权值123456789123456789,要求资瓷两个操作 1 s t a b对s到t路径上的每个节点x加入一个a*w+b的权值,w为x到s的距离 2 s t求s到t路径上的最小值 n,m<=100000分析据说这道题的序列形式叫做李超树,就是每次在区间加入一条线段,然后查询区间的最小值。 但是这是一棵树,那很明显就要上个树剖然后用线段树维护原创 2017-03-26 21:50:03 · 625 阅读 · 0 评论 -
bzoj 3073: [Pa2011]Journeys 线段树优化建图+堆优化dij
题意Seter建造了一个很大的星球,他准备建造N个国家和无数双向道路。N个国家很快建造好了,用1..N编号,但是他发现道路实在太多了,他要一条条建简直是不可能的!于是他以如下方式建造道路:(a,b),(c,d)表示,对于任意两个国家x,y,如果a<=x<=b,c<=y<=d,那么在xy之间建造一条道路。Seter保证一条道路不会修建两次,也保证不会有一个国家与自己之间有道路。 Seter好不容易建原创 2017-04-17 17:12:03 · 921 阅读 · 0 评论 -
bzoj 4817: [Sdoi2017]树点涂色 link cut tree+线段树+树链剖分
题意Bob有一棵n个点的有根树,其中1号点是根节点。Bob在每个点上涂了颜色,并且每个点上的颜色不同。定义一条路 径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色。Bob可能会进行这几种操作: 1 x: 把点x到根节点的路径上所有的点染上一种没有用过的新颜色。 2 x y: 求x到y的路径的权值。 3 x y: 在以x为根的子树中选择一个点,使得这个点到根节点的路径权值原创 2017-04-13 21:50:40 · 1109 阅读 · 0 评论 -
bzoj 3747: [POI2015]Kinoman 线段树
题意共有m部电影,编号为1~m,第i部电影的好看值为w[i]。 在n天之中(从1~n编号)每天会放映一部电影,第i天放映的是第f[i]部。 你可以选择l,r(1<=l<=r<=n),并观看第l,l+1,…,r天内所有的电影。如果同一部电影你观看多于一次,你会感到无聊,于是无法获得这部电影的好看值。所以你希望最大化观看且仅观看过一次的电影的好看值的总和。 n,m<=1000000,w[i]<=1原创 2017-04-19 20:46:50 · 543 阅读 · 0 评论 -
bzoj 4071: [Apio2015]巴邻旁之桥 线段树
题意一条东西走向的穆西河将巴邻旁市一分为二,分割成了区域 A 和区域 B。 每一块区域沿着河岸都建了恰好 1000000001 栋的建筑,每条岸边的建筑都从 0 编号到 1000000000。相邻的每对建筑相隔 1 个单位距离,河的宽度也是 1 个单位长度。区域 A 中的 i 号建筑物恰好与区域 B 中的 i 号建筑物隔河相对。 城市中有 N 个居民。第 i 个居民的房子在区域 Pi 的 Si原创 2017-05-03 10:05:20 · 495 阅读 · 0 评论 -
bzoj 3999: [TJOI2015]旅游 树链剖分+线段树
题意给一棵树,有点权。每次一个操作x y z表示询问从x出发走到y的路径上最大的a[i]-a[j](必须满足先到i再到j)。然后把路径上的点权加上z。 n,q<=50000分析一开始看的时候没啥思路,想了想发现如果用线段树维护的话是可以合并区间的。 那么我们只要用线段树维护两个值,一个是正着走的答案,一个是反着走的答案。查询的时候把路径拆成两条分别查询即可。代码#include<iostream原创 2017-04-21 16:33:34 · 453 阅读 · 0 评论 -
bzoj 2333: [SCOI2011]棘手的操作 离线+线段树
题意有N个节点,标号从1到N,这N个节点一开始相互不连通。第i个节点的初始权值为a[i],接下来有如下一些操作: U x y: 加一条边,连接第x个节点和第y个节点 A1 x v: 将第x个节点的权值增加v A2 x v: 将第x个节点所在的连通块的所有节点的权值都增加v A3 v: 将所有节点的权值都增加v F1 x: 输出第x个节点当前的权值 F2 x: 输出第x个节点所在的连通块中原创 2017-05-23 21:54:32 · 417 阅读 · 0 评论 -
bzoj 2090: [Poi2010]Monotonicity 2 动态规划+线段树
题意给出N个正整数a[1..N],再给出K个关系符号(>、<或=)s[1..k]。 选出一个长度为L的子序列(不要求连续),要求这个子序列的第i项和第i+1项的的大小关系为s[(i-1)mod K+1]。 求出L的最大值。 N, K <= 500,000分析一开始很显然的暴力想法就是f[i,j]表示序列的第i位匹配是否能到关系序列的第j位,然后用数据结构维护一下就好了。复杂度是n^2log,显原创 2017-05-15 15:36:13 · 410 阅读 · 0 评论 -
bzoj 4059: [Cerc2012]Non-boring sequences 线段树+扫描线
题意我们害怕把这道题题面搞得太无聊了,所以我们决定让这题超短。一个序列被称为是不无聊的,仅当它的每个连续子序列存在一个独一无二的数字,即每个子序列里至少存在一个数字只出现一次。给定一个整数序列,请你判断它是不是不无聊的。 1 <= n <= 200000分析首先求出ls[x]和nx[x]表示上一个和x相同的位置和下一个与x相同的位置。 然后显然x的贡献就是(ls[x],x],[x,nx[x])原创 2017-04-25 13:14:40 · 347 阅读 · 0 评论 -
bzoj 3306: 树 dfs序+线段树
题意给定一棵大小为 n 的有根点权树,支持以下操作: 换根 修改点权 查询子树最小值 n,q<=100000分析一开始还以为是某种神奇的lct姿势,后来想了一下,发现如果当前根在x的子树外的话x的子树就还是原来的子树,否则x当前的子树就是除了x的根所在的子树外的其他部分。 那么直接上线段树就好了。代码#include<iostream>#include<cstdio>#includ原创 2017-05-28 14:50:13 · 521 阅读 · 0 评论 -
bzoj 4653: [Noi2016]区间 线段树
题意在数轴上有 n个闭区间 [l1,r1],[l2,r2],…,[ln,rn]。现在要从中选出 m 个区间,使得这 m个区间共同包含至少一个位置。换句话说,就是使得存在一个 x,使得对于每一个被选中的区间 [li,ri],都有 li≤x≤ri。 对于一个合法的选取方案,它的花费为被选中的最长区间长度减去被选中的最短区间长度。区间 [li,ri] 的长度定义为 ri−li,即等于它的右端点的值减去左原创 2017-05-18 12:42:15 · 302 阅读 · 0 评论 -
bzoj 3531: [Sdoi2014]旅行 线段树+树链剖分
题意S国有N个城市,编号从1到N。城市间用N-1条双向道路连接,满足 从一个城市出发可以到达其它所有城市。每个城市信仰不同的宗教,如飞天面条神教、隐形独角兽教、绝地教都是常见的信仰。为了方便,我们用不同的正整数代表各种宗教, S国的居民常常旅行。旅行时他们总会走最短路,并且为了避免麻烦,只在信仰和他们相同的城市留宿。当然旅程的终点也是信仰与他相同的城市。S国政府为每个城市标定了不同的旅行评级,旅原创 2017-04-27 20:09:15 · 332 阅读 · 0 评论 -
bzoj 4777: [Usaco2017 Open]Switch Grass 线段树+最小生成树+set
题意给定一张带权无向图,每个点有一个颜色,每次改变一个点的颜色,要求你在操作后输出这个图中最近异色点对之间的距离最近异色点对定义为:一对点颜色不同,且距离最小。 n,m,q<=200000分析有两个很重要的结论: 1、答案只可能是一条边。 2、答案必然在最小生成树上。 证明的话自己yy一下就好了。 我们可以先求出最小生成树,然后对于每个节点开一棵以颜色为下标的线段树,储存的是其所有子节点到原创 2017-06-01 20:57:48 · 787 阅读 · 0 评论 -
LibreOJ #504. 「LibreOJ β Round」ZQC 的手办 线段树+堆
题意给出一个序列,要求资瓷两个操作: 1 l r k表示把[l,r]中小于k的数都改成k 2 l r k x表示从小到大输出[l,r]中小于k的x个数,若数量不足则输出-1 n,q<=500000分析比赛的时候想到了分块做法,也就是对每块维护一个有序的数组,然后修改的话整块打标记,多出来的O(nlogn)暴力修改。查询的话把每块最小的那个和多出来的都扔进堆里面,然后每次找到堆顶再把其对应块中该原创 2017-06-17 09:23:54 · 936 阅读 · 0 评论 -
bzoj 4276: [ONTAK2015]Bajtman i Okrągły Robin 线段树优化建图+费用流
题意有n个强盗,其中第i个强盗会在[a[i],a[i]+1],[a[i]+1,a[i]+2],…,[b[i]-1,b[i]]这么多段长度为1时间中选出一个时间进行抢劫,并计划抢走c[i]元。作为保安,你在每一段长度为1的时间内最多只能制止一个强盗,那么你最多可以挽回多少损失呢? n<=5000,ai,bi<=5000分析每个小偷往线段树对应区间上连边然后费用流就好了。代码#include<iost原创 2017-06-17 12:03:21 · 501 阅读 · 0 评论 -
bzoj 3589: 动态树 树链剖分+线段树
题意给出一棵树,要求资瓷两个操作: 操作0: 这棵树长出了一些果子, 即某个子树中的每个节点都会长出K个果子. 操作1: 小明希望你求出几条树枝上的果子数. 一条树枝其实就是一个从某个节点到根的路径的一段. 每次小明会选定一些树枝, 让你求出在这些树枝上的节点的果子数的和. 注意, 树枝之间可能会重合, 这时重合的部分的节点的果子只要算一次. n,m<=200000,答案模2^31-1输出原创 2017-06-17 14:09:24 · 499 阅读 · 0 评论 -
bzoj 1758: [Wc2010]重建计划 长链剖分+线段树
题意有一棵树,每条边有边权。请找一条长度为[L,R]之间的简单路径,使得这段路径的平均长度最大。 n<=100000,vi<=1000000分析很显然是先二分答案然后找树上长度在[L,R]之间的最长链。正解是点分治+单调队列,由于我刚学习了一波长链剖分,便拿这题来练练手。 关于长链剖分 长链剖分有两个作用:一是O(nlogn)预处理后O(1)查询一个点的第k级祖先。二是O(n)维护每个子树以深原创 2017-07-11 08:30:29 · 533 阅读 · 0 评论 -
bzoj 4977: 跳伞求生 线段树模拟费用流
题意小Q最近沉迷于《跳伞求生》游戏。他组建了一支由n名玩家(包括他自己)组成的战队,编号依次为1到n。这个游戏中,每局游戏开始时,所有玩家都会从飞机上跳伞,选择一个目的地降落,跳伞和降落的时间有早有晚。在某局游戏降落前,他们在空中观察发现地面上一共有m间房子,编号依次为1到m。其中每间房子恰好有一名敌人早于他们到达。小Q战队的第i名玩家拥有aia_i发子弹,地面上第i间房子里的敌人拥有bib_i发子原创 2017-08-22 07:40:28 · 1239 阅读 · 0 评论 -
bzoj 3333: 排队计划 树状数组+线段树
题意给出一个长度为n的序列A,有m次操作,每次操作会选择一个位置x,然后把该位置后面(包括该位置)所有不大于A[x]的数拿出来重新排列后再放回去。要求在每次操作后输出逆序对数。 n,m<=500000分析我们定义一个位置x的贡献为x后面有多少个比A[x]小的数。那么逆序对数就是每个位置贡献的和。 注意到每次操作会吧位置x后面所有不大于x的位置的贡献变为0,那么只要用一棵线段树来维护即可。代码#i原创 2017-09-03 21:18:15 · 292 阅读 · 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的节点。n<=100000,q<=200000分析像这种题,一般的套路就是对每种权值开一棵线段树然后直接树链剖分即可。代码#include<iostream>#include<c原创 2017-09-04 19:56:56 · 489 阅读 · 0 评论 -
bzoj 3307: 雨天的尾巴 线段树
题意N个点,形成一个树状结构。有M次发放,每次选择两个点x,y 对于x到y的路径上(含x,y)每个点发一袋Z类型的物品。完成 所有发放后,每个点存放最多的是哪种物品。 1<=N,M<=100000 1<=a,b,x,y<=N 1<=z<=10^9分析比较巧妙的一道题。 考虑如果是在一条链上的话要怎么做。那么我们可以在x处加一个加入z的标记,在y+1出加入一个删掉z的标记,然后用权值线段树原创 2017-08-23 17:56:21 · 354 阅读 · 0 评论 -
bzoj 2725: [Violet 6]故乡的梦 堆优化Dijkstra+线段树
题意 分析我们可以先把原图的一条最短路找出来。假设询问一条不在最短路上的边,则答案就为最短路。现在考虑如果删掉一条最短路上的边(x,y)后的答案。 显然答案一定是s-s’-x-y-t’-t其中s’和t’是在最短路上的点,而x,y则不是。 对于每一个点x,求出fs[x]表示从s到x的最短路上,一定是s-s’-x的形式,其中的s’是多少。ft[x]表示从x到t的路径上的t’是多少。 那么对于原图原创 2017-09-24 20:34:07 · 729 阅读 · 0 评论 -
bzoj 1135: [POI2009]Lyz 线段树+Hall定理
题意初始时滑冰俱乐部有1到n号的溜冰鞋各k双。已知x号脚的人可以穿x到x+d的溜冰鞋。 有m次操作,每次包含两个数ri,xi代表来了xi个ri号脚的人。xi为负,则代表走了这么多人。 对于每次操作,输出溜冰鞋是否足够。 1≤n≤200,000 , 1≤m≤500,000 , 1≤k≤10^9 , 0≤d≤n ) ri xi ( 1≤i≤m, 1≤ri≤n-d , |xi|≤10^9分析解法比较巧妙原创 2017-09-09 16:17:44 · 377 阅读 · 0 评论 -
Codeforces 671D Roads in Yusland dfs序+线段树
题意给出一棵以1为根的树,有m条链,每条链有一个代价ci,且满足每条链一定是一条祖先后代链。要求你选出若干条链,使得树上的每条边至少被覆盖一次且代价和最小。 n,m<=300000,ci<=1e9分析一开始去看cf上的题解,上面的每一个单词我都看得懂,可为什么它们拼起来我就看不懂了呢?可能还是因为我太菜了吧。比较巧妙的一道题。一直都在想维护节点信息,却没有想到可以把链按照起点的dfs序来排序然后用原创 2017-09-18 20:06:05 · 746 阅读 · 0 评论 -
bzoj 2962: 序列操作 线段树
题意 有一个长度为n的序列,有三个操作1.I a b c表示将[a,b]这一段区间的元素集体增加c,2.R a b表示将[a,b]区间内所有元素变成相反数,3.Q a b c表示询问[a,b]这一段区间中选择c个数相乘的所有方案的和mod 19940417的值。 100%的数据n<=50000,q<=50000,初始序列的元素的绝对值<=109,I a b c中保证[a,b]是一个合法区间,|c|原创 2017-09-10 21:50:15 · 329 阅读 · 0 评论