
线段树
weixin_44019404
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Educational Codeforces Round 102 (Rated for Div. 2)
A.有且仅有两个情况获胜。全部小于d。最小的两个数字加起来小于d。//// Created by bytedance on 2021/1/23.////#include<iostream>#include<cstring>#include<algorithm>#include<cmath>#include<cstdlib>#include<climits>#include<stack>#incl原创 2021-02-08 18:26:02 · 198 阅读 · 0 评论 -
牛客挑战赛46 F
可以很显然的发现,答案等于∑disti,root−all(lca(l,l+1,l+2,,,,r))\sum{dist_{i,root}}-all(lca(l,l+1,l+2,,,,r))∑disti,root−all(lca(l,l+1,l+2,,,,r))其中我们可以使用线段树取[l,r]lca[l,r]lca[l,r]lca。每一个点到根的和,我们考虑先离线,再accessaccessaccess过程。每一次打通一条链,就要把这条链上,已经遍历过的点到该链的链头的距离给剪掉。在随便使用一个数据结构原创 2020-12-15 10:50:59 · 209 阅读 · 0 评论 -
A Ancient Distance
#include<iostream>#include<cstring>#include<algorithm>#include<cmath>#include<cstdlib>#include<climits>#include<stack>#include<vector>#include<queue>#include<set>#include<bitset>#原创 2020-08-17 20:44:33 · 165 阅读 · 0 评论 -
广州大学第十四届ACM大学生程序设计竞赛 J 登顶
当前我们执行到第iii位置的时候,我们以iii结尾的字串,一共有iii个。分别是[1,i],[2,i],[3,i]..[i,i][1,i],[2,i],[3,i]..[i,i][1,i],[2,i],[3,i]..[i,i]然后令单调栈mx,mnmx,mnmx,mn保存最大值和最小值。我们可以发现的是,以某一个点为终点后,每一个最大/小值是向前作用的。并且具有单调性,即,[j,i][j,i][j,i]的最大值是kkk,那么[1,j−1][1,j-1][1,j−1]的最大值就不会小于kkk。所以利用单调栈保原创 2020-07-29 00:21:51 · 299 阅读 · 0 评论 -
2020牛客暑期多校训练营(第二场) H Happy Triangle
这道题可以用splaysplaysplay等平衡树操作,我利用的线段树。直接思考如何判断三角形成立,即小的两边和大于第三边即可。那么对于找到的三元组{x,a,bx,a,bx,a,b}就有如下的判断(默认a<ba<ba<b)1.x<ax<ax<a&&x<bx<bx<b得到x+a>bx+a>bx+a>b就有x>b−ax>b-ax>b−a2.x>ax>ax>a&&x&l原创 2020-07-15 15:42:41 · 164 阅读 · 0 评论 -
kuangbin带你飞 -----线段树总结一
#include<iostream>#include<cstring>#include<algorithm>#include<cmath>#include<cstdlib>#include<climits>#include<stack>#include<vector>#include&l...原创 2020-07-07 17:07:52 · 128 阅读 · 0 评论 -
Educational Codeforces Round 87 (Rated for Div. 2)
A#include<bits/stdc++.h>using namespace std;#define ll long longint main(){ ll a,b,c,d; int t; scanf("%d",&t); while(t--){ cin>>a>>b>>c>>d; if(a<=b){ printf("%lld\n",b);原创 2020-06-01 15:51:30 · 140 阅读 · 0 评论 -
CodeCraft-20 (Div. 2)
E.令dp[i][status]表示第i位,状态为status的时候,最优解。对于每一个i的时候,遍历所有status转移,然后判断一下这个时候k能否继续插入。#include<iostream>#include<cstring>#include<algorithm>#include<cmath>#include<cstdlib&...原创 2020-03-10 11:37:06 · 147 阅读 · 0 评论 -
2020 CCPC Wannafly Winter Camp Day1 E- 树与路径
通过观察可以发现,当以u为根节点的时候,向他的子节点转移x次,此时差值固定,即等差数列。我们就可以通过树链剖分,给每一条链上,维护线段树,保存等差数列。最后再通过求前缀和的方式求得。#include<iostream>#include<cstring>#include<algorithm>#include<cmath>#include&...原创 2020-03-06 21:27:59 · 143 阅读 · 0 评论 -
第二天打卡 (昨天cf炸了,写到一半上不去了,今天重新开一套写,晚上会补上今天改写的第三套)Educational Codeforces Round 72 (Rated for Div. 2)
题目出的挺好的,数学知识较多。虚拟rk:801A.Creating a Character题意:给出力量和敏捷两个属性,现在给出技能点数,在必须使用完技能点数的情况下,有多少种情况,力量属性严格大于敏捷。wa了4次。细节蛮多的。可以推导出来 (力量-敏捷)+技能点数/2>点在敏捷上的技能点数 就能满足题意。不过需要特判,敏捷额外的点数不能超过所有技能点数,而且不能为负数。#i...原创 2019-12-05 19:47:02 · 174 阅读 · 0 评论 -
HYSBZ - 2243
vjudge上已经关闭了,要去洛谷提交才行。板子题目,注意线段树查询的时候,被分段了,也要去判断颜色。在这里wa了一发。#include<iostream>#include<cstring>#include<algorithm>#include<cmath>#include<cstdlib>#include<climi...原创 2019-10-21 14:51:39 · 171 阅读 · 0 评论 -
hdu 3966 树链剖分
树链剖分模板题目,记录一下。总结:这里我re了 几次,在于update操作中,应该先判断头节点的深度,优先跳转深度浅的,而不是判断当前两个点那个更深,这是没有意义的。这里son可以memset成-1,因为dfs的时候会优先赋值不会存在数组越界。head数组也需要复制-1。其余数组在两次dfs中会被依次赋值,再多组输入中不用重复清空,会自动覆盖掉上次结果。#include<iost...原创 2019-10-15 21:42:28 · 110 阅读 · 0 评论 -
codeforces 1149c
给出了()的字符串,这里的()字符串可以看成是dfs序列,再求lca时的那张表。所以这一个序列就可以看成是在dfs序上面,求树的直径。取某一段[l,r],可以知道lca一定在[l,r]之间。我们就用公式 diameter=hight[l]+height[r]-2* height[lca(l,r)]来维护两个点的之间的距离。把(看成1,)看成-1,可以发现height[i]=sufix[i...原创 2019-10-15 19:17:04 · 213 阅读 · 0 评论 -
G - Multidimensional Queries 线段树结合状压
题意 给出一个k维度空间,求[l,r]的最大曼哈顿距离。用二进制枚举绝对值相加可能出现的所有情况。用线段树来维护单点修改,区间查询。#include<iostream>#include<cstring>#include<algorithm>#include<cmath>#include<cstdlib>#include<...原创 2019-10-11 20:15:43 · 137 阅读 · 0 评论 -
codeforces 718c 矩阵快速幂套线段树
题意 给出一个序列ai,定义斐波那契数列,求sigma f(ai)还有可能令一段ai加上一个数字。斐波那契数列可以有矩阵快速幂加速求出,复杂度logn,我们这里定义mat为加速矩阵,那么对一段求和便可以写成sigma mati,对于一段区间加上一个数字,实际上等同于给每一个mat在乘上一个矩阵。实际上变成维护区间加和的题目,只不过每一个节点储存一个矩阵。 #include<io...原创 2019-10-09 16:11:56 · 95 阅读 · 0 评论 -
POJ 3468 线段树
模板题目。用线段树就好了。关于线段树参考白皮书。这里用每一段线段树来更新累加和。注意要用longlong才行。详细看代码注释。#include<iostream>#include<cstring>#include<algorithm>#include<cmath>#include<cstdlib>#include<...原创 2019-03-21 17:17:24 · 104 阅读 · 0 评论 -
POJ 3264 线段树维护最大最小值
线段树的应用问题。开两个数组分别维护每个区间的最大值和最小值。其他和线段树一样最后输出max-min就好了。#include<iostream>#include<cstring>#include<algorithm>#include<cmath>#include<cstdlib>#include<climits>...原创 2019-03-26 13:57:17 · 161 阅读 · 0 评论 -
POJ 1769线段树维护dp
我们设dp[i][j]为做到第i个sort时候,最大值被移动到j需要转移用的数目。dp[i][j]=dp[i-1][j](if(ti!=j) 即移动不到当前最大值dp[i][j]=min(dp[i-1][j], dp[i-1][k] (si<=k<=ti)+1(if(ti=j))即这个最大值包含在这个区间。我们发现dp值只与他前一个有关,故可以开滚动数组,而且可以知道,以前的状...原创 2019-03-28 17:55:32 · 201 阅读 · 0 评论 -
POJ 3171 线段树维护dp
滚动数组。dp[t2]=min(dp[t2],dp[t]+s)(t1-1<=t<=t2)即 t2时间结尾的话,最小金钱值为自己和,在自己区间里(左-1)里面选一个时间加上自己的金钱的较小的那个。因为自己区间里面的时间的金钱一定是上一个牛转移而来的(默认排序了的),那么现在这头牛加入进来,就有选与不选的权利,在自己区间里面选一头牛,因为必须要连续所以必须要选,挑选一个最小的,相反,...原创 2019-03-28 19:58:42 · 184 阅读 · 0 评论 -
2019牛客暑期多校训练营(第七场)
C题:题意:给出n种树,每一种树对应了高度,砍掉一颗需要的钱,和数量。现在问,花费最少的钱,使得所有高度最高的树的和大于阳现在树的总和的一半(严格)采用权值线段树写。我们考虑一下,树的高度等于x时,我们该如何计算当前的费用。首先统计所有树的高度等于x的,那么这个时候x是最高的,所以大于x的全部砍掉,而小于x的树,我们只需要砍到数量等于x-1即可。那我们就可以首先根据高度排序,那么比当前高的...原创 2019-08-11 23:10:22 · 99 阅读 · 0 评论 -
kuangbin带你飞----线段树专题一(基础操作,单点,区间更新和查询)
A题意:给出q个询问,单点更新和查询主要是注意模板的书写#include<iostream>#include<cstring>#include<algorithm>#include<cmath>#include<cstdlib>#include<climits>#include<stack>#...原创 2019-09-18 19:00:46 · 198 阅读 · 0 评论 -
cf-877e Danil and a Part-time Job
题意所有房间成一棵有根树,房间1为根节点,每一次pow操作要求把当前节点在内的,以及他的子树全部反转一遍即1变成0,0变成1。每一次get操作进行求和,算出该节点在内的和他子树所有房间为1的个数即求和。方法:dfs序建线段树,用模板进行修改一下即可。区间反转问题还是一样,要对该区间操作为奇数才进行反转偶数次操作无效,也就对应了lazy标记该怎么推。先初始化线段树然后每一次如果是有效操作,那么s...原创 2019-09-19 21:20:35 · 140 阅读 · 0 评论 -
kuangbin带你飞--线段树二
j题意:每一个人都有一个boss,没有boss的那一个人是最终大boss,每一次发放任务个x,他的所有的以他为boss的人也就是说子树(包括自己)全部都开始做这个任务。我们可以看到这一棵树是无序的,而且是并不是二叉树,所以就需要转换。既然跟子树有关,我们就深度优先遍历,用dfs来建立序列,一个点有开始和结束的编号,他的所有子树的编号一定会在开始和节点之间,这样子就可以做到区间更新。所以我...原创 2019-09-20 12:33:10 · 99 阅读 · 0 评论 -
Educational Codeforces Round 6 E. New Year Tree
题意给出一个有根树,给出m个操作,操作1表示使得这一棵树的某一个节点的所有子树染上某一种颜色,操作2表示查询这个节点及其子树的颜色数量。思路对于一颗有根树来说,我们依靠dfs序就可以变换成为一个有序的序列,所以根据dfs序可以建立线段树。对于线段树的操作,更新的话,区间更新,推lazy标记,问题是怎么去统计颜色的数量,这也关系到我们将怎么去推lazy标记。如果单纯的修改,变换tree[r...原创 2019-09-22 11:31:10 · 92 阅读 · 0 评论 -
Buses and People (线段树,偏序集)
题意:有n两车,起点s终点t,t时间发车并达到。现在又m个人,每一个人想从l到r时间为t,问他能搭乘的最近一班汽车。抽象出来的问题为,解决,A<=A’,B’<=B,T’<=T的问题。我们离线处理。先按照l即车的起点和人的起点排序,得到在每一个人查询前,已经插入进去了车子且保证车子起点比人靠前。我们继续建立时间线段树(先离散化了时间),在每一个时间轴上,建立一个右端点,表示这...原创 2019-10-01 21:21:03 · 161 阅读 · 0 评论 -
F - MEX Queries 线段树上二分 离散化端点 细节lazy标记
题意:给出三个操作:1 区间置12.区间置零3.区间反转,零变1,1变成0;每一次操作过后,求出第一个零开始的位置。端点直接到了1e18,longlong级数了,所以肯定是先离散化端点,而这里我们求的并不是区间信息,而是只需要看这区间是否是1或者0,所以离散化后不需要+1操作。置1,置0,基本操作,区间更新,推至lazy标记。区间反转,基本操作,tree[root]=(区间长度-t...原创 2019-10-05 20:08:50 · 154 阅读 · 0 评论 -
cf 833B 线段树优化dp
写出转移方程即可。贡献值计算有通用方法:记录每一个颜色上一个位置,这个颜色只在上个位置到当前位置有贡献,为1,这个可以通过线段树做到。同样,dp值也可以用线段树查询,所以我们把他们同时丢到一颗线段树里面就行了。#include<iostream>#include<cstring>#include<algorithm>#include<cmath&...原创 2019-10-06 17:25:21 · 233 阅读 · 0 评论 -
POJ 2991线段树
思路就是按照白皮书上走得,不过代码没有按照白皮书的写,一些关键点直接看代码吧。学到的公式:向量 以任意(x0,y0)顺时针旋转a角度后新向量x’=(x-x0)*cos(a)-(y-y0)*sin(a)+x0y’=(x-x0)*sin(a)+(y-y0)*cos(a)+y0#include<iostream>#include<cstring>#include<...原创 2019-03-21 15:24:16 · 147 阅读 · 0 评论