数据结构
文章平均质量分 60
行码棋
退役ACMer,落魄过,那么光亮在何时?
展开
-
【2023蓝桥杯C++A组】【启发式合并】颜色平衡树
最小值的更新时,例如可能只有一个颜色出现次数为5,然后刚好这个颜色的节点添加进来,那么出现次数就为6了,最小值需要更新为6,而不是取。给定一棵树,结点由 1 至 n 编号,其中结点 1 是树根。树的每个点有一个颜色 Ci。如果一棵树中存在的每种颜色的结点个数都相同,则我们称它是一棵颜色平衡树。求出这棵树中有多少个子树是颜色平衡树。分别代表颜色出现次数的最小值和最大值。原创 2023-04-15 18:31:16 · 2069 阅读 · 2 评论 -
【扩展域并查集】Codeforces Round #747 (Div. 2) D. The Number of Imposters
题目链接:https://codeforces.com/problemset/problem/1594/D有 n 个人,每个人可能是诚实的人或者说谎的人。诚实的人永远说真话,说谎的人永远说假话。有 m 个条件,分别表示 i 说 j 是诚实的人/说谎的人。你需要判断在这些限制条件下,最多有可能有几个诚实的人,或输出 -1 声明不可能存在这种情况。分析规则:若A说B诚实,则AB要么都诚实,要么都是骗子若A说B骗子,则A诚实B骗子 ,或者A骗子B诚实可以发现当一个人诚实和骗子确定下来,原创 2022-02-22 20:03:46 · 276 阅读 · 0 评论 -
【并查集】【最大连通块大小】D. Social Network
并查集原创 2022-02-07 15:14:22 · 802 阅读 · 0 评论 -
【并查集】【区间问题】E - Range Sums
并查集原创 2022-02-06 13:56:47 · 949 阅读 · 0 评论 -
【ST表】【倍增】RMQ问题
ST、倍增、RMQ原创 2021-03-18 21:38:31 · 211 阅读 · 0 评论 -
【线段树】【HDU4027】Can you answer these queries?
博客主页: https://blog.csdn.net/qq_50285142欢迎点赞????收藏✨关注❤留言 ???? 如有错误,敬请指正????虽然生活很难,但我们也要一直走下去????题目链接一个序列,可以进行两次操作:1.对区间内的每个元素取平方根,取整数 2.询问区间的和思路:线段树乍一看是处理区间的问题,但是处理区间的问题求总和比较麻烦。但是从取平方根入手,发现最大的2642^{64}264取7次就会变成一,如果变成一的话,我们对变成一的区间进行特判(区间长度=区间和),原创 2021-10-07 20:25:38 · 139 阅读 · 2 评论 -
【线段树】【树套树】【杭电oj】Luck and Love
博客主页: https://blog.csdn.net/qq_50285142欢迎点赞????收藏✨关注❤留言 ???? 如有错误,敬请指正????虽然生活很难,但我们也要一直走下去????题目链接思路:问题是要询问满足两个区间的最大缘分值,因为一个树只能记录一个区间,我们只能再弄个树,所以就是树套树了。同时还要记录最大值。主树记录身高这个区间,附树记录活泼度这个区间,同时记录最大值。每个线段树节点都要声明一颗线段树,来记录满足身高区间内的其它情况。所以都要有两个函数,一个是主树的,原创 2021-10-06 18:27:20 · 154 阅读 · 4 评论 -
【线段树】【杭电oj】Tunnel Warfare
博客主页: https://blog.csdn.net/qq_50285142欢迎点赞????收藏✨关注❤留言 ???? 如有错误,敬请指正????虽然生活很难,但我们也要一直走下去????题目链接题意:有一排村庄,村庄两两之间有一条地道,可以进行三种操作:1.D摧毁一座村庄(村庄毁了,与它连接的地道也毁了)2.Q询问一座村庄连接的村庄数目(地道必须连接)3.R恢复上一次摧毁的村庄思路:【线段树】我们考虑把村庄按节点来存储,存储两个属性,区间最大值和区间最小值把区间最大值初原创 2021-09-30 22:05:24 · 123 阅读 · 0 评论 -
【线段树】Just a Hook
博客主页: https://blog.csdn.net/qq_50285142欢迎点赞????收藏✨关注❤留言 ???? 如有错误,敬请指正????虽然生活很难,但我们也要一直走下去????题目链接题意:n个小棒,初始都为铜质,每次操作可以选择一个区间将所有的小棒改变成同一个质地(金银铜),求所有小棒的总价值,默认金银铜的价值分别为3,2,1【线段树】区间修改的操作,add标记区间的单个小棒的价值,每次访问到一个区间就要把信息向下传递,同时总数进行改变(pushdown操作)最后直原创 2021-09-28 18:57:41 · 115 阅读 · 1 评论 -
【线段树】模板题pushup+pushdown操作
线段树pushup和pushdown操作的经典模板原创 2021-09-20 21:58:26 · 1200 阅读 · 1 评论 -
【单调队列】数据结构之单调队列详解
单调队列1.初步认识单调队列是一个数据结构,并不是STL里面的内容。单调队列为何说单调,因为是队列中的元素始终保持着单增或者单减的特性。(注意始终保持这四个字)简单的sort排序就可以让一个序列有序了,为何又多此一举多出来个单调队列实现类似的功能呢?其实单调队列不只是做到了排序,还可以实现一个功能:在每次加入或者删除元素时都保持序列里的元素有序,即队首元素始终是最小值或者最大值,这个功能非常重要,单调队列我们就是使用的这个功能。举个例子:我们依次加入5个元素,分别为5,8,2,4,1那么我们假原创 2021-09-12 10:28:29 · 9097 阅读 · 28 评论 -
【线段树】【区间修改】区间求和
题目链接思路:使用线段树区间修改(懒标记)注意pushdown操作的位置,懒标记是当前节点的子节点的标记,并不包括自己这个节点。询问的时候需要把懒标记向下更新,因为懒标记不包括父节点。要注意pushup和pushdown的位置代码:#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N = 1e5+5;int n,m;int w[N];struct node{ int原创 2021-08-14 10:18:31 · 287 阅读 · 0 评论 -
【线段树】【数组差分】区间最大公约数
思路:做这道题真的是数据范围害死人,我就是没有注意到需要开到long long的范围,参数数据类型没写对,查bug查了一下午这道题要求的是区间的最大公约数,显而易见可以用【线段树】维护差分注意一:可以看到数据范围很大,需要开long longlong \ longlong long,修改的值v需要是long longlong \ longlong long,注意参数一定数据范围写对注意二:gcd(a,b)=gcd(b,a−b)gcd(a,b) = gcd.原创 2021-08-13 18:06:38 · 237 阅读 · 0 评论 -
【线段树】你能回答这问题吗?
思路:线段树节点需要存储六个信息,连续区间和的最大值,连续前缀和的最大值,连续后缀和的最大值最大连续区间和可能横跨左子区间和右子区间,当横跨时,区间和就为左子区间的最大后缀和加上右子区间的最大前缀和,然后再和左右区间的最大连续区间和取最大值,即tr[u].mx=max(max(tr[u<<1].mx,tr[u<<1∣1].mx),tr[u<<1].rmax+tr[u<<1∣1].lmax);tr[u].mx = max(max(tr[u<<.原创 2021-08-13 13:36:25 · 80 阅读 · 0 评论 -
【线段树】区间和
区间和做法:节点个数设为4倍的区间长度使用线段树模板就可,注意a,b≤na,b \leq na,b≤n,建树的区间需要是[1,n][1,n][1,n]而不是[1,m][1,m][1,m]代码:#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N = 1e5+5,M = 5e5+5;int n,m;int k,a,b;struct node{ int l,r; ll su原创 2021-08-12 21:14:19 · 162 阅读 · 0 评论 -
线段树模板
建议上B站搜索线段树,播放量最多的那个视频讲的很详细。#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn = 1000;int tr[maxn],a[maxn];//建树 void build(int i,int l,int r){ if(l == r) { tr[i] = a[l]; return; } int mid = (l+r) >>原创 2021-03-29 21:55:33 · 99 阅读 · 0 评论 -
【线段树】最大数
最大数使用数据结构线段树来维护区间的最大值。树中的每个节点都代表一个区间,同时记录了一个当前记录区间的最大值。树的结点个数为区间长度的4倍:视最后一层叶子节点个数为NNN,那么所有的节点数之和为2N−12N-12N−1,最后一层的节点可能还有分叉,节点个数最多为完全二叉树最后一层节点数目的2倍为2N2N2N,总的个数为4N−14N-14N−1#include<bits/stdc++.h>using namespace std;const int N = 200005;int m原创 2021-08-12 17:29:57 · 290 阅读 · 0 评论