数据结构
文章平均质量分 63
xxx
tzteyang
这个作者很懒,什么都没留下…
展开
-
线段树合并 简单例题
1.1.1.CF600E经典的dsu on treedsu \ on \ treedsu on tree解决的问题,其实也可以用线段树合并做。用一个dfsdfsdfs遍历这棵树的时候,每次都把父节点代表的树和子节点的数合并起来,然后最后合并完所有的子树之后,再把当前的父节点更新即可,接着存一下当前节点对应的答案,这样就可以每次都统计某个子树的最优颜色了。#include <bits/stdc++.h>using namespace std;#原创 2021-06-04 13:20:15 · 244 阅读 · 0 评论 -
P2617 Dynamic Rankings 动态主席树 (支持插入后再更新)
思路:只看询问操作的话,就是很普通的主席树,但是这道题目里还增加了一个修改操作,这在以前的主席树题目中是没有的,即是是所谓的区间修改,那也是先处理好修改操作在进行查询,而不会在查询中夹着修改。所以这道题我们需要另一种方法来解决。假如我们在xxx点处修改了axa_xax的值,那么很明显在区间[x,n][x,n][x,n]内的维护的数值都应该被更新,因为维护的相当于是一个前缀信息嘛,那么这时候我们要是再暴力的[x,n][x,n][x,n]修改复杂度肯定不允许的,所以能想到用什么方法优化这个修改操作嘛。.原创 2021-06-04 12:48:27 · 226 阅读 · 1 评论 -
2019ICPC徐州 H - Yuuki and a problem (动态(带修)主席树 + 区间Mex问题)
题意:给你一个长度为nnn的序列,然后mmm个询问,你有两种操作,定义如下:1. 1 x y1.\ 1\ x\ y1. 1 x y,即令ax=ya_x = yax=y,修改操作.2. 2 l r2.\ 2 \ l \ r2. 2 l r,表示询问你区间[l,r][l,r][l,r]内所有的数的MexMexMex是多少,即这r−l+1r - l + 1r−l+1个数所不能组成的最小的原创 2021-06-04 12:46:48 · 407 阅读 · 0 评论 -
关于线段树的一些魔幻操作[学习笔记] 转自xyz32768
转自:https://blog.csdn.net/xyz32768/article/details/84398038引入众所周知,线段树可以维护序列,进行区间操作单点加 + 区间求和区间加 + 区间求和区间加 + 区间乘 + 区间求和(省略…)但是有些操作呢,又不能像上面这三个问题一样通过简单的打标记 + 提取区间解决仍需要用到一些tricktricktrick一、势能线段树我们知道,线段树能够通过打标记实现区间修改的条件有两个:1.1.1.能够快速处理标记对区间询问结果的影响原创 2021-06-04 10:20:10 · 161 阅读 · 0 评论 -
2020ICPC昆明 M - Stone Games (主席树 + 思维)解决区间Mex问题
题意:给你一个长度为nnn的数组,每次询问给出一个区间[l,r][l,r][l,r],问你用当前的区间内的任意个数,不能组成的最小的正整数是多少?思路:这道题其实需要解决的就是,怎么快速求出来,这个不能表示的数是多少,我们这样考虑,假设把当前给定的区间的内的数al,al+1,....,ara_l,a_{l+1},....,a_ral,al+1,....,ar按照从小到大的顺序排起来,考虑sis_isi为这组序列前iii个数的和,我们如果能找到,si+1<ai+1s_i+1 < a_原创 2021-05-25 10:52:57 · 723 阅读 · 0 评论 -
李超线段树 例题BZOJ1568、3938
大佬的博客讲的很清晰李超线段树就是标记永久化维护区间线段最值的数据结构假设有下列的问题:给定平面中nnn条线段,(给出斜率kkk和截距bbb,并且知道线段左右端点的横坐标值为多少),然后mmm个询问,每次给定x=x0x = x_0x=x0,问和x=x0x = x_0x=x0相交的直线中,横坐标值最大为多少。很明显nnn和mmm数据范围大了之后,我们无法暴力,此时看到区间端点,可以想能否用数据结构维护这个东西,即----李超线段树,查询和更新借助线段树都变成了lognlognlogn了,变的可接受原创 2021-05-18 20:23:44 · 373 阅读 · 1 评论 -
标记永久化 简易模板两个版本的写法
#include <bits/stdc++.h>using namespace std;#define pb emplace_back#define MP make_pair#define pii pair<int,int>#define pll pair<ll,ll>#define lson rt<<1#define rson rt<<1|1#define CLOSE std::ios::sync_with_stdio(fal原创 2021-05-13 20:19:42 · 517 阅读 · 0 评论 -
HDU3333 Turing Tree (离线处理 + 线段树) 询问区间内不同的数的和
题意:给你一个长度为nnn序列aia_iai,然后给你mmm个询问,每个询问给出l,rl,rl,r,问你区间[l,r][l,r][l,r]内各不相同的数的和是多少。思路:其实之前碰到过类似思路的问题了,如果codeforces703Dcodeforces703Dcodeforces703D,求区间内出现偶数次的数的异或和,就需要我们求出区间内不同的数的异或和为多少。同理这个题需要我们维护的是区间内出现不同的数的和,类似于那题,可以观察到这道题目里面并没有要求我们在线修改,那么我们就可以通过把区间按原创 2021-05-12 20:14:27 · 101 阅读 · 0 评论 -
HDU 6534(XTCPC2019)C - Chika and Friendly Pairs (莫队 + 权值树状数组)
题意:思路:再想过了一些主席树等大数据结构如何维护后,毫无头绪,此时根据数据范围找算法可能,注意到3e43e43e4的数据那么O(nn)O(n\sqrt n)O(nn)也可过,再加上题目里并没有要求我们强制在线处理,所以可以用莫队来解决。下一步就是找一种方法来快速的获得,当前遍历的[l,r][l , r][l,r]区间间内值域处于[ai−k,ai+k][a_i -k,a_i + k][ai−k,ai+k]的数有多少,一开始看到这个无脑想到主席树lognlognlogn的查询,就冲了,结果一直t原创 2021-05-03 18:51:51 · 141 阅读 · 1 评论 -
牛客练习赛81 D - 小Q与树 (点分治)
思路:一看到树上的路径统计问题而且还可以接受O(nlogn)O(nlogn)O(nlogn)的复杂度,就可以往点分治的方向考虑一下。这道题的关键就是怎么O(n)O(n)O(n)的统计一下当前一棵树内的∑u=1n∑v=1nmin(au,av)dis(u,v)\sum_{u=1}^{n}\sum_{v=1}^{n}min(a_u,a_v)dis(u,v)∑u=1n∑v=1nmin(au,av)dis(u,v),我们可以从这个minminmin下手去考虑每个点权值aia_iai会对答案产生的贡献。.原创 2021-04-29 16:44:09 · 186 阅读 · 0 评论 -
The 18th Zhejiang Provincial Collegiate Programming Contest (ZJCPC)部分题解
F,G,J,LF - Fair DistributionG - Wall GameJ - Grammy and JewelryL - String FreshmanF - Fair Distribution题意:给定你nnn个机器人,mmm块巧克力,你可以进行如下的两种操作若干次。1.1.1.摧毁掉一个机器人2.2.2.增加一块巧克力的数量问你能够是n∣mn|mn∣m的最小操作次数是多少,nnn不可以变为0。思路:1.1.1.假如n≥mn \geq mn≥m,那么答案一定就是n−mn - m原创 2021-04-26 13:56:40 · 1658 阅读 · 0 评论 -
2020 ICPC Asia Taipei-Hsinchu Regional H - Optimization for UltraNet (生成树 + 二分)
题意:题目略长,就是让你求一棵生成树,这棵树要满足的条件时最小的边尽可能的大,同时其它的边又要尽可能的小。思路:看到求最小边最大,就可以联想到,把边权排序之后,去二分枚举哪一条才是符合要求的。每次找到一条边,因为我们是按边权值排好序的,那么我们只需要从这个最小边去顺着找,看能否组成一棵树,最后二分出来答案。根据题目的描述我们可以知道,计算这棵树的大小时,是每次我们找到这棵树的最小边然后计算这条边的贡献,(即经过这条的边的所有路径的路径和),下一次计算就把这条边去掉。换成公式来讲就是当前边的权值为w,.原创 2021-01-27 10:56:07 · 278 阅读 · 0 评论 -
Codeforces 703D (区间内出现偶数次的数的异或和)
题意:给定你一个长度为n的序列,然后m个询问,每次询问给出L和R,问你在这个区间内出现次数为偶数次的数(每个数只取一个),他们的异或和为多少。思路:出现次数为偶数次这些异或都会变成0,所以我们直接求区间异或和,求出来的出现次数为奇数词的数的异或和,假如我们能求得这个区间内不同的数的异或和,那他们二者异或一下就可以得到我们想要的答案了。然后问题就变成了怎么求区间内不同数的异或和呢。m个询问,我们可以离线处理,按照右端点从小到大的顺序排序,然后每次只去更新距离当前右端点r最近的值的位置,再把这个位置之间的.原创 2021-01-27 10:24:20 · 444 阅读 · 0 评论 -
Educational Codeforces Round 102 (Rated for Div. 2) D. Program (区间最值 + 思维)
题意:给定你一个长度为n的序列,一个变量x初始值为0,序列中的+代表x+1,-代表x-1,m个询问,每给定l和r,问你假如把[l,r]区间内的序列去掉,其他顺序不变,变量x一共会有多少个不同的值。思路:操作只有加一和减一,代表我们值一定是在连续变化的,所以我们只要能得到,序列的中的最小值和最大值那么就可以知道他有多少个不同的值。维护一个前缀和序列sum。对于l和r,我们求得[0,r]的最小值和最大值,[r+1,n]的最小值和最大值,但是因为中间的[l,r]区间被去掉那么相应地这一部分的贡献就会在后面的.原创 2021-01-16 21:49:54 · 250 阅读 · 0 评论 -
Codeforces Global Round 12 D.Rating Compression (单调栈 + 思维 + 树状数组)
题意:给定你一个序列,然后假如给你一个k,然后对原序列每k个元素求一下最小,这样会求出n-k+1的最小值,如果这个n-k+1个最小值能组成一个1到n-k+1的排列那么对应答案的第k位1,否则为0,然后问你对于所有的1<=k<=n,对应的k为多少?思路:方法来自这个大佬我们考虑用两个单调栈一个维护aia_iai作为最小的的左端点在哪里,另一个维护aia_iai作为最大值的右端点在哪里。这样就能够求出aia_iai作为最小值的区间是[Li,RiL_i,R_iLi,Ri],区间长度即为.原创 2020-12-08 13:09:22 · 358 阅读 · 0 评论 -
2020ICPC·小米 网络选拔赛第一场 E-Phone Network (思维 + 线段树)
题意:给定你一个长度为n的数组,然后对于一个i,让你找到数组中的数能覆盖从1 - i的最少的数为几个,记作为ansians_iansi,让你求出ans1,ans2,....ansmans_1,ans_2,....ans_mans1,ans2,....ansm各自为多少?思路:直接上题解 不好想…我用我自己的话理解一下题解。维护的这个Ri,lR_{i,l}Ri,l,从i状态到i+1状态其实就只有两种情况,一是当前的Ri,lR_{i,l}Ri,l是大于i+1这个数的下一个位置,这种情况最右.原创 2020-12-03 19:56:51 · 162 阅读 · 0 评论 -
BZOJ3261 最大异或和 可持久化Trie模板题
题目点这里他要求一个区间内的位置到结尾处异或和的最大值,我们转换一下,设S[i]表示前i个位置上的数异或起来的结果,即异或值的前缀和。于是题目的要求a[p] ^ a[p+1] ^… a[n] ^ x = s[p-1] ^ s[n] ^ x.。于是题目就相当于变成了,已知一个值val = s[n]^x,求一个位置p满足 l-1 =< p <= r-1,使得s[p] ^ val的这个值最大这样的话我们只需要将trie可持久化后,每次区间询问位置合法(即两个版本间是否有合法位置)是查询val每一原创 2020-09-09 12:34:31 · 155 阅读 · 0 评论 -
BZOJ2653 middle (主席树 + 二分答案 + 维护区间最大连续字段和)
题意:就是问你在给定的[a,b]和[c,d]中怎么样选择左右端点,才能使得这段区间内的数的中位数最大。思路:首先一个对于中位数的套路,对一个M,把区间内小于它的数赋值为-1,大于等于他的数为1,如果对于一个给定的区间,区间和大于等于0的话,代表这个M一定大于等于这个区间的中位数。很明显这个值符合单调递增的性质,所以我们具体找确定的中位数,只需要二分答案即可。再看如何,在[a,b]和[c,d]这个区间内选择,暴力肯定是会超时的,在想这个和不是有单调性嘛,那我们只需要得到给定区间内的最大值看他是否可行即可.原创 2020-11-22 20:26:04 · 235 阅读 · 0 评论 -
P3939数颜色 (主席树)
题意:中文题面,十分清晰思路:很明显的主席树操作,查询区间某数的出现次数,但是更新的时候操作比较秀。我们把xix_ixi和xi+1x_{i+1}xi+1进行交换,我们这样操作,先把a[xi]a[x_i]a[xi]和a[xi+1]a[x_{i+1}]a[xi+1],然后只需要改root[x]和root[x-1]即可,因为我们是在x-1的基础上更改这样不仅可更新x+1带来的影响同时还能把之前的x值给覆盖掉。可以完美AC,要不会被卡好像。代码:#include <bits/stdc++.h.原创 2020-11-20 19:34:45 · 196 阅读 · 0 评论 -
Gym 102770 E-Easy DP Problem (主席树查询区间前k大的和)
题意:写着DP总不可能是dp吧,就是给定一个dp[i][j]的求解方式,如图中分段函数所示,然后给你一个l r k,然后问你dp[ r-l+1 ][ k ]的值为多少?思路:既然题目那这DP,那应该就不是DP吧。手写几项后,反正我写不出来 ,发现我们需要求得就是(∑i=1r−l+1i2\sum_{i=1}^{r-l+1}i^2∑i=1r−l+1i2) + [blb_lbl,bl+1,......brb_{l+1},......b_rbl+1,......br]中前k大的数和。前面的式子很好维护.原创 2020-11-19 15:05:45 · 1820 阅读 · 0 评论 -
2020计蒜之道 线上决赛 C - 攀登山峰(主席树查询出现次数符合要求的最大的下标值)
题意:题目给定一个序列,然后会有m次询问,每次询问让我们找到是否有山峰的高度满足大于(r-l+1)/t,如果有的话输出满足这个条件的山峰最大的高度,否则的话输出-1。思路:区间加询问出现次数满足要求的的高度,很明显得主席树的相关操作。有点小模板题的味道。要找的是满足题目要求高度的最大值,首先看a的范围,先离散化一下,然后对应树存的值就是这个高度出现的次数,只不过这是对应离散化数组的,最后还要再转化为原数组的实际高度,wa了好几次。然后查询函数的时候,因为要找的是最大值,所有我们在递归往下进行的时候先.原创 2020-10-25 18:35:57 · 143 阅读 · 0 评论 -
Gym 102770 C-Crossword Validation 2020浙江省赛(字典树 + 细节读题)
题意:长的我都不想看… 给定你一个NxN的矩阵,矩阵中的元素有#和小写字母,#代表障碍。然后给定你m个询问,每个询问都含有一个字符串和值。然后从矩阵中截取子串,子串的截取规则是水平方向上顶到障碍的和竖直方向上顶到障碍的所有子串,然后问你这些子串是否全部存在于我询问的m个字符串中,若存在的话输出他们的总和值,否则输出-1。思路:题目最后的输入保证的是询问的范围大小,从这点都很容易想到应该对这m个串操作,把这m个串先插入到字典树中,然后每次枚举合法的截取子串看是否存在于字典树即可。用到的插入和查询都是基..原创 2020-11-18 18:31:51 · 602 阅读 · 0 评论 -
Gym 102770 B-Bin Packing Problem 2020浙江省省赛 (线段树 + set)
题意:装箱问题。两种算法分别对应操作系统中的首次适应算法和最佳适应算法。然后给定你一个请求序列(顺序不可更改),然后问你在这两种不同的算法下,每种情况会各自申请多少个个大小为C的箱子?思路:很明显就是想怎么用算法有优化这个两种模拟。对于第一种操作:我们每次都需要找的是最前面的第一个大于当前ai的箱子,快速查询就那么几种方法,这里没有顺序,所以我们就有线段树维护区间最大值,然后既然要找最前面的,那么我每次就在符合条件的情况下,尽量往左子树走,否则才会往右子树去找。第二种操作:每次找的是大于等于当前值的.原创 2020-11-17 20:50:40 · 932 阅读 · 0 评论 -
Codeforces 242E-XOR on Segment (线段树 + 区间异或修改、求和)
题意:给你一个长度为n的序列,然后给出每个ai的值。有两种操作:1 l r代表求出区间[l,r]内的ai的和。2 l r x代表把区间[l,r]内的所有的 ai 变成 ai ^ x。对于每个1操作输出查询的结果。思路:看操作很明显就是线段树的操作。但是这里注意对于异或这个运算是不满足交换律的,也就是说 a ^ (b+c) != (a ^ c + b ^ c),那么我们就没办法直接对区间进行操作了。但是,看到异或就应该想到二进制有没有方法,很明显区间ai的和也等于把每一个ai二进制拆分后统计对应二进.原创 2020-11-15 18:27:46 · 657 阅读 · 0 评论 -
2019 CCPC Final K - Russian Dolls on the Christmas Tree
~模板题qwq题意:在一棵树中,假如某些节点的序号值是相连的,则可以把他们连接在一起,然后问你每一棵子树中的所有节点(包括当前节点)经过连接之后最后能剩余几段。思路:很明显是一个树上启发式合并的模板题。我们只需要用一个vis数组记录,然后没走到一个节点u的时候,去看vis[u+1]和vis[u-1]这两个节点是否存在,对应就会出现三种情况:1.对应的前驱和后继节点都没有出现过,可知此时在当前子树中,这个节点是孤立的,所以就目前来看他最后会形成一个单独的段,答案+ +2.对应的前驱和后继节点都出现过了原创 2020-10-06 19:39:15 · 447 阅读 · 1 评论 -
树上启发式合并
树上启发式合并:dsu on tree 粗略讲解:DSU ON TREE 解决离线统计子树的优秀算法,好像也可以叫静态链分治。启发式合并一般是将小的集合向大的集合上面去合并,这是一种用于优化暴力统计子树的黑科技。看一道例题:CF600E,给定你n个序号,每个序号对应的颜色序号为col[i],问你每一棵子树中颜色最多的颜色的编号之和为多少(因为可能有多种颜色出现的次数是最多的,所以问的是颜色序号之和)。我们先考率暴力的算法,对于每一个节点我们去统计它的子树,但是由于每棵子树之间应该是相互不影响的,所原创 2020-10-06 19:37:51 · 487 阅读 · 1 评论 -
2020CCPC长春站 F-Strange Memory (dsu on tree + 二进制拆分答案贡献)
第一次做dsu on tree维护异或的题目,思路还不是很活跃,再去找相关的几道题去做一下。题意:给定你n个点,和他们对应的节点值ai。然后让你找出所有满足题目要求的式子的点对的异或和。(i,j)和(j,i)是一对相同的点对。思路:很明显想要解决这个式子,我们有两个问题需要去解决,第一,如何去找到(i,j)这个点对值的LCA。第二,如何去找到满足条件的所有(i,j)点对值的亦或者。我们这样考虑,这道题直接去找给出的i和j的LCA是不现实的,但是这道题并没有让我们去找到某一个确切的LCA是谁,而是要统.原创 2020-11-13 20:42:22 · 317 阅读 · 0 评论 -
2020CCPC绵阳站 J-Joy of Handcraft (去重 + 线段树 + 调和级数)
题意:给定n个灯泡,那个灯泡排列在电路板上,然后每个灯泡给定你一个t和x,这个灯泡会在[2kt + 1,2kt + t],k=(0,1,2…)的时间区间内发出亮度为x的光,其他时间内不发光,然后给定你一个m问你:从第一秒到第m秒每一秒时亮度最大的灯的亮度为多少?辅助:首先我们应该知道调和级数也就是 (1/1 + 1/2 + 1/3 +…+1/n)这个东西的部分和为ln(n)+ 欧拉常数,近似等于logn思路:所以这道题对于给定的m个区间,因为求得是最大的的亮度为多少,所以我们先排个序,将重复时间区间的.原创 2020-11-08 21:57:39 · 643 阅读 · 0 评论 -
HDU 6274 Master of sequence (公式处理 + 二分 + 树状数组)
题意:给定你两个序列a和b,然后有三种不同的操作,分别是修改a数组,修改b数组,给定一个k值,查询一个满足条件的最小的t值,条件是S(t) >= k。思路:操作3是找一个满足条件的最小的t值,然后很明显t值越大s(t)这个式子也是越大的,满足单调性,很明显我们需要二分这个t来解决。然后我们在观察操作3让我们询问的式子,因为答案是整数,所以这样的分式求和没法直接变成一个式子解决,我们知道分式向下取整,会分为两个部分,一个是bi/ai的整数部分,另一个余数的分数部分即bi%ai,两个这样的分数求差就可.原创 2020-11-08 15:17:30 · 160 阅读 · 0 评论 -
2020ICPC·小米 网络选拔赛第二场 C - Data Structure Problem (化简公式 线段树)
题意:给定一个n,还有一序列a和b,然后m次操作,操作的具体提要求看题目吧。看题目名字都知道是数据结构题了,再看到修改查询操作就想线段树。思路:想用线段树,但是根据题目给定的查询形式,无法直接区间询问或者啥操作,所以需要我们化简一下这个询问的公式。询问Cx,就要对每一个 1 <= i <= x,做一个这样的操作Ci = max(Ci-1 + bi,ai)我们写一下c3的式子看下规律:c1 = max(c0 + b1 , a1)c2 = max(c1 + b2 , a2) = max.原创 2020-11-04 21:43:56 · 157 阅读 · 0 评论 -
第 45 届国际大学生程序设计竞赛(ICPC)亚洲网上区域赛模拟赛 A-Easy Equation (差分枚举乱搞)
很明显的题意,给你a,b,c,d,问你满足x+y+z=k关系的等式的个数有多少?思路:考虑枚举的情况,但是要用到差分去由优化一下。先考虑枚举x的时候,考虑x+y可能的值的范围就是[x,x+b],所以我们用一个差分数组记录一下,做第二次枚举之前,前缀和统计一下第一层枚举是差分数组的答案。然后考虑枚举x+y的情况,x+y+z的取值范围就是[x+y,x+y+c],同理也是统计一遍答案。然后我们只需枚举d的取值范围,让答案的范围在等式左右两边都成立即可。代码:#include <bits/stdc+.原创 2020-11-01 16:06:48 · 666 阅读 · 3 评论