数据结构
文章平均质量分 53
昵称很长很长真是太好了
这个作者很懒,什么都没留下…
展开
-
[CTSC2018]混合果汁 二分 套 主席树上二分
题意:n种果汁,第iii种果汁的美味程度是did_idi有lil_ili升,价格是pip_ipi升mmm个询问,要求使用果汁的总量不小于LimLimLim,价格不超过GGG,最大化所用的果汁的美味程度最小值思路:大体思路:首先二分出来一个taste,然后在比taste高的里面去找一些价格少的,且能凑到L升的果汁,检查是否能凑出。我们发现题目询问很多次,那么我们对于每一次的询问二分,在二分检查时肯定不可以O(n)去检查,因为这样时间复杂度就变成了O(m∗n∗logn)O(m*n*logn)原创 2021-10-18 22:42:48 · 205 阅读 · 0 评论 -
P1502 窗口的星星 离散化+扫描线
题意:一个二维平面上有些点有权值。问给你一个H*W的窗口,问窗口星星亮度总和的最大值。H∗W范围:1e6H*W 范围:1e6H∗W范围:1e6坐标范围:1e9坐标范围:1e9坐标范围:1e9星星数目:1e4星星数目:1e4星星数目:1e4题解:我们考虑一维的情况。假设一个序列aaa,给你你最多可以选择连续长度为lenlenlen序列段,问可以选择出最大的序列和为多少。我们可以将这个(单点修改,区间查询)的问题给转换成,(区间修改,单点查询)问题。初始化一个新数组bbb为0对于第iii原创 2021-10-13 15:43:56 · 144 阅读 · 0 评论 -
[湖南集训]更为厉害 树上主席树-以树深度为下下标建立主席树
题意题解:首先对于树上某个点a来说,假设点b是a的祖先(也就是在a的上面),那么答案很好计算,也就是min(k,dep[a]−1)∗(size[a]−1)min(k,dep[a]-1)*(size[a]-1)min(k,dep[a]−1)∗(size[a]−1)麻烦的就是计算b在a下面的情况。主席树。如何建立这颗主席树呢?按照每个结点的深度建立主席树即可。对于下面的结点来说,我们假设一个结点iii,那么这个结点对答案的贡献则为size[i]−1size[i]-1size[i]−1那么我们在df原创 2021-10-08 14:03:25 · 161 阅读 · 0 评论 -
P4113 [HEOI2012]采花 树状数组离线
题意:询问区间内有多少个出现次数大于等于2次数的种类。n<=2e6题解:主要是n<=2e6,不然确实有很多种做法跟HH的项链一样的思路,发现是离线,想了一会发现好像跟hh的项链一样哎,我们按照查询的区间按照右端点排序,然后开始遍历这个序列,如果这个数前面出现过一次,那么我们就在他前面的那个位置+1,前面的前面的位置-1,然后正常统计即可。其实跟HH的项链一个思路。代码:#include<bits/stdc++.h>#define endl '\n'#define i原创 2021-09-29 15:34:49 · 140 阅读 · 0 评论 -
P3224 [HNOI2012]永无乡 FHQ-Treap 启发式合并
题意:B x yB\ x\ yB x y 表示在岛 xxx 与岛 yyy 之间修建一座新桥。Q x kQ\ x\ kQ x k 表示询问当前与岛 xxx 连通的所有岛中第 kkk 重要的是哪座岛,即所有与岛 xxx 连通的岛中重要度排名第 kkk 小的岛是哪座,请你输出那个岛的编号。题解:一眼题,用并查集维护一下连通块,平衡树合并时用启发式合并,合并最多也就nlognnlognnlogn次,总时间复杂度位O(nlogn2原创 2021-09-28 12:05:05 · 371 阅读 · 0 评论 -
P1486 [NOI2004] 郁闷的出纳员 FHQ-Treap
题意:第一行有两个整数 nnn 和 minminmin。nnn 表示下面有多少条命令,minminmin 表示工资下界。接下来的 nnn 行,每行一个字符xxx和一个整数 kkk,表示一条命令。命令可以是以下四种之一:I k 新建一个工资档案,初始工资为 k。如果某员工的初始工资低于工资下界,他将立刻离开公司。A k 把每位员工的工资加上 k 。S k 把每位员工的工资扣除 k。F k 查询第 k 多的工资。在初始时,可以认为公司里一个员工也没有。题解:只做过一两道平衡树的题目原创 2021-09-24 21:30:07 · 151 阅读 · 0 评论 -
P4216 [SCOI2015]情报传递 LCA+树上主席树 离线操作
题意:给你一棵n个点的树,初始每个位置没有点权有m次操作1 x:让一个点从当前时刻开始,每秒操作点权++2 x y c:查询一条链中有多少点的点权大于c其中每秒操作点权++就是指我每操作一次,无论是否和那个点有关,那个点权值都会++1操作对于每个点只会开始一次题解:此题的做法非常多大部分都是O(m(logn)2)O(m(logn)^2)O(m(logn)2)的做法,也就是很朴素的树剖+线段树离线询问。学习了一种O(mlogn)O(mlogn)O(mlogn)的做法,十分巧妙。看到查询原创 2021-09-21 16:34:37 · 141 阅读 · 0 评论 -
[51nod] 1766树上的最远点对 树的直径 树剖LCA+ST表静态查询
题意:给你一棵带权树,q次查询,每次给出两个区间,[l1,r1][l2,r2][l_1,r_1] [l_2,r_2][l1,r1][l2,r2]从这两个区间中分别选择两个数字,使得这两个点的距离最大,这个最大的距离是多少。题解:树的直径性质:距离树上任意点最远的点一定是直径的一端。此结论在点集中依然试用。那么答案路径的两端一定是[l1,r1][l_1,r_1][l1,r1]直径的一端和[l2,r2][l_2,r_2][l2,r2]直径的一端的连线。那么我们只要求出[l1,r1][原创 2021-09-17 20:52:03 · 129 阅读 · 0 评论 -
CF702F T-Shirts (排序+平衡树)
题意:有nnn种 T 恤,每种有价格 cic_ici 和品质 qiq_iqi。有 mmm 个人要买 T 恤,第 iii 个人有 viv_ivi 元,每人每次都会买一件能买得起的 qiq_iqi 最大的 T 恤。一个人只能买一种 T 恤一件,所有人之间都是独立的。问最后每个人买了多少件 T 恤?如果有多个 qiq_iqi 最大的 T 恤,会从价格低的开始买。题解:对所有衣服按照q[i]q[i]q[i]从大到小排序对每个人维护a[i]a[i]a[i]表示其剩余的钱,b[i]b[i]b原创 2021-09-15 00:12:54 · 279 阅读 · 0 评论 -
Naive Operations (线段树 分析复杂度)
题目:给出一个长度为n初值为0的数组,以及长度为n的b数组,然后q次操作,add(l,r) 使得区间l-r所有元素+1,或者查询l~r区间a[i]/b[i]的和题解:很少情况下能很快写出一道线段树题目,关键还0调试首先题目说了b是个排列,突破点也就是b这个条件。因为题目是向下取整,那么假设b[1]=100000,那么你对他修改99999次都是没有任何影响的,那岂不是可以不去修改这个点。同理考虑其他的节点,发现b[i]越大,那么a[i]/b[j]如果变大的话,需要修改的次数也会越多。我们计算一下这原创 2021-09-09 19:15:19 · 233 阅读 · 0 评论 -
Codeforces Round #742 (Div. 2) E. Non-Decreasing Dilemma (线段树维护区间连续问题)
题意:操作1:把x位置的数字修改成y。操作2:查询[l,r]之间不下降序列的个数。题解:线段树维护区间和问题 (这是套路,想不到只能说做题少别打我) 。用五个变量进行维护。sum区间总个数llen从左边这个数字开始往右最长不下降序列长度(往右端最长延伸)rlen从右边这个数字开始往左最长不上升序列长度(往左端最长延伸)lnum这个区间最左端的数字rnum这个区间最右端的数字很明显lnum和rnum很好维护,直接pushup即可。如果左子树的右端小于等于右子树的左端。sum则需要在两原创 2021-09-06 01:41:23 · 308 阅读 · 0 评论 -
P4755 Beautiful Pair (数据结构+分治)
题意:小D有个数列a ,当一个数对(i,j)(i≤j)(i,j)(i\leq j)(i,j)(i≤j)满足 aia_iai和 aja_jaj 的积不大于 ai,ai+1,.........,aja_i, a_{i+1},.........,a_jai,ai+1,.........,aj中的最大值时,小D认为这个数对是美丽的.请你求出美丽的数对的数量。n≤1e5n \leq1e5n≤1e5ai≤1e9a_i \leq1e9ai≤1e9有人推荐笛卡尔树的练习题?但是怎么也想原创 2021-09-04 15:03:00 · 252 阅读 · 1 评论 -
P6617 查找 Search 线段树 查找区间内是否有两个和为w的数(w不变)
题解:每个点x,设置其前驱为离其最近的w-x的位置每次修改可能影响O(n)个位置:w-x x x x x x x…这样后面每个位置的前驱都是w-x如果修改了w-x的值,这样会导致O(n)个修改注意到这个是存在性判定如果存在两个(i1,j1),(i2,j2)(i_1,j_1),(i_2,j_2)(i1,j1),(i2,j2)使得a[i1]+a[j1]=w,a[i2]+a[j2]=wa[i_1]+a[j_1]=w,a[i_2]+a[j_2]=wa[i1]+a[j1]=w,a[i2]+原创 2021-08-28 22:05:22 · 203 阅读 · 0 评论 -
P3797 妖梦斩木棒 线段树区间合并
题意:1 x C 将第x个小段的木棒替换成C型,C只会是’X’,’(‘,’)’中的一种2 l r 询问妖梦从第l段到第r段之间(含l,r),有多少个完整的木棒完整的木棒左右两端必须分别为’(‘和’)’,并且中间要么什么都没有,要么只能有’X’。题解:典型的线段树维护区间合并问题 (特别注意query中的合并)开三个数组,ls代表左端是否拥有右括号,rs代表右端是否有左括号,ishave用来代表区间中是否有括号。代码:#include<bits/stdc++.h>#define原创 2021-08-12 20:53:02 · 140 阅读 · 0 评论 -
HDU7059-Counting Stars 线段树 (区间加最低位置,区间减最高位)
题意:一个序列,三种操作1.查询序列l,r之间的和2.给l,r之间每个数加上自己二进制最高位3.给l,r之间每个数减去自己二进制的最低位置。题解:我们把一个数分解成二进制的状态进行思考,设cnt为数x当前二进制状态下不为0的位数有多少,我们发现对于两个修改操作,你无论怎么修改,cnt都不会增加,考虑1e9最多有30位不为1的数,你每进行一次操作3,这个数的cnt就会-1,那么每个数最多可以进行30次操作三,多余的操作三没有什么效果。我们可以把一个数分成(最高位+其他位)来进行维护。那么对于操原创 2021-08-12 17:08:56 · 269 阅读 · 1 评论 -
hdu6989 (莫队+单调栈+ST表)
题意: 求l-r之间所有区间最大值最小值之和的期望,除法按照逆元来求;题解: 看之前刚补的一道题目,那道题目跟这道题差不多,解释都在下面的链接中。[HNOI2016]序列就是取余把人取傻了。#include<bits/stdc++.h>#define int long longusing namespace std;const int maxn = 4e5+10;const int mo=1e9+7;int n,m;int a[maxn];int anshou[maxn]原创 2021-08-06 11:41:01 · 182 阅读 · 0 评论 -
P3246 [HNOI2016]序列(查询l-r中所有区间的最小值之和)
多校时做到了查询区间l-r中所有区间的最大值与最小之和的题目,有好多细节不太会处理,去看题解发现是一道差不多的原题,于是打算先把原题补一下。题解:ST表+单调栈+莫队看到计算区间最小值之和,不难想到可能会与单调栈有关系,再想了一下,应该是需要计算每个数对这个区间做了多少贡献。然后看到离线操作还可以去思考莫队,但是很遗憾,想到这里思路就没太有了。去翻了翻题解恍然大悟。我们考虑莫队的转移,如果我们能O(1)O(1)O(1)求出左端点对整个区间的贡献,和右端点对区间的贡献,那么就可以莫队了首先我们可以看原创 2021-08-06 09:52:06 · 520 阅读 · 0 评论