数据结构
文章平均质量分 59
夏水天国
需要学的还有很多
展开
-
HH的项链(可持久化线段树解法)
想要知道[L,R][L,R][L,R]区间中不同的数是多少设w[i]w[i]w[i]是区间中第iii个数xxx上一次出现的位置如果w[i]<Lw[i]<Lw[i]<L,那么答案+1我们用[L,R][L,R][L,R]这一段的w[i]w[i]w[i]来建立一个权值线段树,然后问询这个权值线段树中[1,L−1][1,L-1][1,L−1],就可以得到答案但问询很多,显然我们不能一次问询建一次线段树。所以可以用可持久化线段树来实现同时为了防止出现0,所以w[i]w[i]w[i]均+1原创 2022-04-22 11:50:27 · 364 阅读 · 0 评论 -
2021威海D Period(哈希表)
感觉这题最大的困难在于理解period这个单词是什么意思。。。。原文是A integer number T is a period of a string s if and only if 1≤T<|s| and s[i]=s[i−T] for every i∈(T,|s|].翻译过来就是找到一个最大的K,使得[1,k]与[n-k,n]这两段字符串相同对于匹配相同字符串很容易想到用哈希表+前缀和实现而题目中将一个字符改成’#‘说白了就是最长只能找到’#'前面这个位置(因为其他字符都是小写字母原创 2021-11-25 10:28:45 · 546 阅读 · 0 评论 -
牛客练习赛91BC 魔法学院(线段树/差分/并查集加速暴力)
B题,数据范围1e5,范围较小。区间修改,区间查询,很明显的线段树+懒标记板子,套一块模板即可#include <iostream>#include <bits/stdc++.h>using namespace std;const int N = 1e5 + 10;int n, m, w[N];struct node { int l, r; int sum, add;} tr[4 * N];void pushup(int u) { tr[u].sum =原创 2021-11-13 14:20:05 · 294 阅读 · 0 评论 -
Shuffle Cards (splay)
题目大意:给定一个数组1 2 3 4 5…有m次操作,每次给定一个p和s,然后将数组中[p,p+s-1]中的数放到数组最前方。最后输出操作完后的顺序实际上这个操作转化成可以分成三次翻转假设p=2,s=3,1:翻转[1,p+s-1]4 3 2 1 52:翻转[1,3]2 3 4 1 53 翻转[4,4]2 3 4 1 5形式化来讲就是int l = 1, r = p + s - 1; rev(l, r); // rev(l, s); rev(s + 1, r);显然,这原创 2021-11-12 16:17:33 · 188 阅读 · 0 评论 -
第十三届河南省赛J甜甜圈 (树状数组 )
原题有个小点:吃甜甜圈不算一个步骤有题易得,最优的步骤是确定了的:每次就找到最大的值,把其上的所有甜甜圈移动到另一边,然后吃掉最大的为了加速这个过程,我们考虑将两堆甜甜圈顶部对接这样,样例中的两组甜甜圈1 4 52 7 3变成了5 4 1 || 2 7 3将7吃掉的过程就变成了把那个竖杠移动到7的前面5 4 1 2 ||7 3,斜杠变化前后中间隔着1个非零数(2)随后7被吃掉,把7设为0,现在是 5 4 1 2 || 0 3 花费步骤1接下来要吃5,吃掉后变成0 || 4 1 2 0原创 2021-11-01 17:51:35 · 130 阅读 · 0 评论 -
Codeforces Round #749D Omkar and the Meaning of Life (思维题,并查集)
题目大意:有一个长度为n的无重复元素的序列A,最多可以执行2n次询问,每次询问由一个?加上一个长度为n的序列B。spj会让AB对位相加,然后返回由新序列中最小的索引K,要求K索引所对应的值在新序列中出现不止一次,若找不到,就返回0设n=5,可以询问例如 1 1 1 1 2 这样的数据,此时返回的数值就是比第五位数大1的那个数的位置假设序列A是3 2 1 5 4,我们询问1 1 1 1 2,得到回复4,即4号位比5号位大1我们询问1 1 1 2 1,得到回复 0,即4号位是最大的询问 1 1 2 1原创 2021-10-19 11:34:16 · 158 阅读 · 0 评论 -
Codeforces Round #742E Non-Decreasing Dilemma(线段树)
题目大意:给一个数组,有两种操作1:改变数组中的一个值2: 求区间中成非递减的子序列有多少个刚开始拿到题感觉:这不就是个板子吗?然后这道板子题就卡了我两天,直到看了别人的代码才知道错哪儿了节点需要维护的信息:左右区间范围当前区间中,合法子序列的数量包含左端点的最长合法子序列的长度(llen)包含右端点的最长合法子序列的长度(rlen)让我们合并两个区间的时候,需要分情况讨论如果左儿子最右端的数大于右儿子最左端的数:父区间的合法子序列的数量就是两个子区间合法子序列的数量如果左儿子最原创 2021-09-07 21:08:37 · 128 阅读 · 2 评论 -
hdu7116 lowbit (线段树+lowbit的性质)
大意:两种操作1给区间内所有ai加上lowbit(ai)操作2:区间问询总和lowbit的性质:lowbit(ai)会取ai二进制下的最高位的1,例如5的二进制是101,lowbit(5)=1,4的二进制是100,lowbit(4)=4;用以下代码可以快速算出lowbitint lowbit(int x) { return x & (-x);}另一个性质:一个数最多进行加log次lowbit,二进制就会变成1000……000的形式,此时再加lowbit就是这个数乘2.用线段树+懒.原创 2021-09-05 10:52:50 · 424 阅读 · 0 评论 -
AcWing 918 软件包管理器 (树链剖分+线段树)
Linux 用户和 OSX 用户一定对软件包管理器不会陌生。通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖(即下载安装这个软件包的安装所依赖的其它软件包),完成所有的配置。Debian/Ubuntu 使用的 apt-get,Fedora/CentOS 使用的 yum,以及 OSX 下可用的 homebrew 都是优秀的软件包管理器。你决定设计你自己的软件包管理器。不可避免地,你要解决软件包之间的依赖问题。如果软件包 A 依赖原创 2021-09-03 14:09:53 · 149 阅读 · 0 评论 -
程序自动分析 (离散化并查集)
原题需要离散化的并查集题,留作个笔记#include <bits/stdc++.h>using namespace std;typedef pair<int, int> PII;const int N = 1e5 + 10;int n, cnt;vector<PII>eqs;//可以相等的两个数vector<PII>uneqs;//不可相等的两个数unordered_map<int, int> H;int p[N * 2];原创 2021-08-20 19:53:11 · 81 阅读 · 0 评论 -
2021牛客多校9E Eyjafjalla (主席树+倍增法)
调了很久的树套树,最后华丽丽的tle了题目大意:给定一个树形结构,1号点是树根.越接近树根温度越高,现有一种生存温度在[L,R]区间病毒在点X处出现,如果某个节点的温度在[L,R]区间,且与其相邻的点感染了病毒,那么这个点也会感染病毒有很多询问,每次询问在X点爆发一种生存温度[L,R]的病毒,最多能感染多少个点先想想暴力做法:暴力dfs,必然会TLE考虑到题目中给出的是一个树形结构,且温度的增长是有单调性的,病毒传染的过程就可以分成两步:先从当前点出发,找到温度小于等于R且最接近源点的点(找祖先)原创 2021-08-15 12:31:18 · 332 阅读 · 6 评论 -
2021牛客多校8F Robots(离线分治)
题目大意:在nXm的图上有些障碍物,有三种机器人1:只会往下走2:只会往右走3:又会右走又会下走现给出Q个机器人,已知其起点,终点,类型,问机器人能否到达终点机器人数量很多(5e5),而地图很小(500*500)这就可以考虑离线做法,维护终点,判断哪些起点可以到达该终点用一个结构体来储存这些机器人问询t代表机器人类型,id代表机器人编号,x,y为起点编号struct node { int t, x, y, id;};vectorq[i][j];储存终点为i,j的问询接下来就是如原创 2021-08-10 17:11:58 · 183 阅读 · 0 评论 -
2021牛客多校7F xay loves trees (线段树+括号化区间)
拒绝中国大学生英语阅读理解大赛!打得最快乐的一场,因为没有谜语人出题题目大意:给两个有n个节点n-1个边的有向树,让你选择一些点,使得1:在第一个树上,这些点是连通的,而且一个点必定是另一个点的祖先2:在第二个树上,任意两个点互相都不是祖先第一个树就要求了这些点刚好刚好构成一个链,而这些点在第二个树中不能在同一个链里思路是:从第一个树上的某个点开始深搜,当新搜索到的点与当前已搜索到的某个点在第二棵树中位于同一个链上,就返回搜索其他边.所以我们可以用线段树来维护来维护括号化序列首先对第二个树进原创 2021-08-08 12:51:07 · 187 阅读 · 0 评论 -
数据结构 猫树
照例orz immortablco猫树,可以高效处理维护无修改的某种支持结合律和快速合并的信息,要求在线。猫树是线段树的一个变种,其询问复杂度可以达到O(1)以区间最大和为例#include <cstdio>#include <cstring>#include <iostream>#define ll long longusing namespace std;const int M = 2e5 + 3;int n, m, len, a[M];int原创 2021-08-06 13:12:11 · 1647 阅读 · 1 评论 -
2021牛客多校6H Hopping Rabbit (线段树+扫描线)
题目大意:在整个范围内给出若干个矩形,在给出一个数字d,要让我们找到一个坐标(x,y),使得(x+0.5+kd,y+0.5+kd)(k取任意值)不会落入任何一个矩形里.如果有就输出任意一个坐标,没有就输出no本题的关键点是(x+0.5+kd,y+0.5+kd),如果我们把整张图分成许多d*d的小正方形,就会出现如图的情况(本图来源于题解的ppt)其中的黄色圆点就是我们想要找的点,我们可以看到如果我们将每个dd小块中被矩形占据的位置"移动"到左下角的小块中,就会出现如图的情况也就是说我们只需要在d原创 2021-08-05 20:16:12 · 255 阅读 · 0 评论 -
2021牛客多校6K Starch Cat(点分治+猫树)
目前的水平还不能独立写出来这道题,所以只好看着标程用自己的码风写了一遍QWQ(不得不说大佬们的代码简直如同加密文件)本题是猫树+点分治+DP 猫树和淀粉质都加了注释,但是DP还没有看懂所以没注释,等以后水平提升了再回来完善DP的部分QWQ#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N = 5e5 + 10;const int LOGN = 22;struct Rand {原创 2021-08-04 21:55:20 · 612 阅读 · 1 评论 -
数据结构 ST表
ST表的用处是处理区间最值问题对于一个数组a[n]设另一个数组f[n][m]对于f数组中的一项f[i][j]表示从a[n]中的第i项开始,在长度为2^m(2的m次方)的区域内的最大值f[i][0]指a[i]自己利用递推的方式得到ST表void st(){ for(int i = 1; i <= n; i ++) f[i][0] = a[i]; int t = log(n) / log(2) + 1;//t就是最小的t满足2^t>=n for(int j =原创 2021-07-31 19:45:27 · 90 阅读 · 0 评论 -
树上计数2 树上莫队
原题给定一棵 N 个节点的树,节点编号从 1 到 N,每个节点都有一个整数权值。现在,我们要进行 M 次询问,格式为 u v,对于每个询问你需要回答从 u 到 v 的路径上(包括两端点)共有多少种不同的点权值。输入格式第一行包含两个整数 N,M。第二行包含 N 个整数,其中第 i 个整数表示点 i 的权值。接下来 N−1 行,每行包含两个整数 x,y,表示点 x 和点 y 之间存在一条边。最后 M 行,每行包含两个整数 u,v,表示一个询问。输出格式共 M 行,每行输出一个询问的答案。数原创 2021-07-24 10:21:40 · 921 阅读 · 0 评论 -
数据结构 线段树+懒标记
原题给定一个长度为 N 的数列 A,以及 M 条指令,每条指令可能是以下两种之一:C l r d,表示把 A[l],A[l+1],…,A[r] 都加上 d。Q l r,表示询问数列中第 l∼r 个数的和。对于每个询问,输出一个整数表示答案。输入格式第一行两个整数 N,M。第二行 N 个整数 A[i]。接下来 M 行表示 M 条指令,每条指令的格式如题目描述所示。输出格式对于每个询问,输出一个整数表示答案。每个答案占一行。数据范围1≤N,M≤105,|d|≤10000,|A[i]原创 2021-07-19 22:06:19 · 1107 阅读 · 0 评论 -
郁闷的出纳员 (splay) 题解
原题OIER 公司是一家大型专业化软件公司,有着数以万计的员工。作为一名出纳员,我的任务之一便是统计每位员工的工资。这本来是一份不错的工作,但是令人郁闷的是,我们的老板反复无常,经常调整员工的工资。如果他心情好,就可能把每位员工的工资加上一个相同的量。反之,如果心情不好,就可能把他们的工资扣除一个相同的量。我真不知道除了调工资他还做什么其它事情。工资的频繁调整很让员工反感,尤其是集体扣除工资的时候,一旦某位员工发现自己的工资已经低于了合同规定的工资下界,他就会立刻气愤地离开公司,并且再也不会回原创 2021-07-21 10:26:54 · 264 阅读 · 0 评论 -
数据结构 点分治
原题给定一个有 N 个点(编号 0,1,…,N−1)的树,每条边都有一个权值(不超过 1000)。树上两个节点 x 与 y 之间的路径长度就是路径上各条边的权值之和。求长度不超过 K 的路径有多少条。输入格式输入包含多组测试用例。每组测试用例的第一行包含两个整数 N 和 K。接下来 N−1 行,每行包含三个整数 u,v,l,表示节点 u 与 v 之间存在一条边,且边的权值为 l。当输入用例 N=0,K=0 时,表示输入终止,且该用例无需处理。输出格式每个测试用例输出一个结果。每个结果占原创 2021-08-03 12:48:56 · 296 阅读 · 0 评论