
ACM - 数据结构
文章平均质量分 60
ACM - 数据结构
行码棋
ZZUer -> USTCer,退役ACMer。个人站点:wyqz.top
展开
-
数据结构单调栈详解
原题的题意可以理解为求所有子区间的最大值减去最小值的和。即所有子区间的最大值减去最小值。我们考虑用单调栈求解。维护两个数组 l[i] ,r[i]。表示当前元素作为最大值所能到达的左边和右边的下标是多少(当前元素作为最值),用单调栈维护。先正着维护左区间,再倒着维护右区间。维护时的操作:当前元素大于前一个元素时,下标存上一个l[i]的下标,一直循环下去,直到当前数小于前面比较的数,左区间维护成功。右区间的维护是同样的道理。维护最小值只需要把原来数组全部变成相反数,可以找到最小值。求和:排列..原创 2021-03-15 15:03:09 · 889 阅读 · 0 评论 -
【2023蓝桥杯C++A组】【启发式合并】颜色平衡树
最小值的更新时,例如可能只有一个颜色出现次数为5,然后刚好这个颜色的节点添加进来,那么出现次数就为6了,最小值需要更新为6,而不是取。给定一棵树,结点由 1 至 n 编号,其中结点 1 是树根。树的每个点有一个颜色 Ci。如果一棵树中存在的每种颜色的结点个数都相同,则我们称它是一棵颜色平衡树。求出这棵树中有多少个子树是颜色平衡树。分别代表颜色出现次数的最小值和最大值。原创 2023-04-15 18:31:16 · 2356 阅读 · 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 · 358 阅读 · 0 评论 -
【并查集】【最大连通块大小】D. Social Network
并查集原创 2022-02-07 15:14:22 · 985 阅读 · 0 评论 -
【并查集】【区间问题】E - Range Sums
并查集原创 2022-02-06 13:56:47 · 1021 阅读 · 0 评论 -
【ST表】【倍增】RMQ问题
ST、倍增、RMQ原创 2021-03-18 21:38:31 · 259 阅读 · 0 评论 -
【线段树】【HDU4027】Can you answer these queries?
博客主页: https://blog.youkuaiyun.com/qq_50285142欢迎点赞????收藏✨关注❤留言 ???? 如有错误,敬请指正????虽然生活很难,但我们也要一直走下去????题目链接一个序列,可以进行两次操作:1.对区间内的每个元素取平方根,取整数 2.询问区间的和思路:线段树乍一看是处理区间的问题,但是处理区间的问题求总和比较麻烦。但是从取平方根入手,发现最大的2642^{64}264取7次就会变成一,如果变成一的话,我们对变成一的区间进行特判(区间长度=区间和),原创 2021-10-07 20:25:38 · 204 阅读 · 2 评论 -
【线段树】【树套树】【杭电oj】Luck and Love
博客主页: https://blog.youkuaiyun.com/qq_50285142欢迎点赞????收藏✨关注❤留言 ???? 如有错误,敬请指正????虽然生活很难,但我们也要一直走下去????题目链接思路:问题是要询问满足两个区间的最大缘分值,因为一个树只能记录一个区间,我们只能再弄个树,所以就是树套树了。同时还要记录最大值。主树记录身高这个区间,附树记录活泼度这个区间,同时记录最大值。每个线段树节点都要声明一颗线段树,来记录满足身高区间内的其它情况。所以都要有两个函数,一个是主树的,原创 2021-10-06 18:27:20 · 205 阅读 · 4 评论 -
【线段树】【杭电oj】Tunnel Warfare
博客主页: https://blog.youkuaiyun.com/qq_50285142欢迎点赞????收藏✨关注❤留言 ???? 如有错误,敬请指正????虽然生活很难,但我们也要一直走下去????题目链接题意:有一排村庄,村庄两两之间有一条地道,可以进行三种操作:1.D摧毁一座村庄(村庄毁了,与它连接的地道也毁了)2.Q询问一座村庄连接的村庄数目(地道必须连接)3.R恢复上一次摧毁的村庄思路:【线段树】我们考虑把村庄按节点来存储,存储两个属性,区间最大值和区间最小值把区间最大值初原创 2021-09-30 22:05:24 · 167 阅读 · 0 评论 -
【线段树】Just a Hook
博客主页: https://blog.youkuaiyun.com/qq_50285142欢迎点赞????收藏✨关注❤留言 ???? 如有错误,敬请指正????虽然生活很难,但我们也要一直走下去????题目链接题意:n个小棒,初始都为铜质,每次操作可以选择一个区间将所有的小棒改变成同一个质地(金银铜),求所有小棒的总价值,默认金银铜的价值分别为3,2,1【线段树】区间修改的操作,add标记区间的单个小棒的价值,每次访问到一个区间就要把信息向下传递,同时总数进行改变(pushdown操作)最后直原创 2021-09-28 18:57:41 · 168 阅读 · 1 评论 -
【线段树】模板题pushup+pushdown操作
线段树pushup和pushdown操作的经典模板原创 2021-09-20 21:58:26 · 1425 阅读 · 1 评论 -
【单调队列】数据结构之单调队列详解
单调队列详解和习题引入原创 2021-09-12 10:28:29 · 13518 阅读 · 29 评论 -
【线段树】【区间修改】区间求和
题目链接思路:使用线段树区间修改(懒标记)注意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 · 347 阅读 · 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 · 296 阅读 · 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 · 126 阅读 · 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 · 198 阅读 · 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 · 140 阅读 · 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 · 375 阅读 · 0 评论