ACM&数据结构
数据结构
0iq2333
欢迎访问我的个人主页:0iq2333.github.io
展开
-
线段数组入门题题解
A - Ultra-QuickSort 本题要求逆序对,可以用归并排序或树状数组去求。 题解:离散化+树状数组。 将每个数值压入树状数组中,然后将离散化好的数组,倒叙进行树状数组的更新和查询,ans加上当前压入树状数组的比他小的数据的个数。 ACcode: /* * @Author: NEFU_马家沟老三 * @LastEditTime: 2020-06-22 15:48:33 * @CSDN blog: https://blog.csdn.net/acm_durante * @E-mail: 10原创 2022-01-09 17:48:48 · 186 阅读 · 0 评论 -
2021hdu多校1 Xor sum(字典树)
**题意:**给你一串数组a,问连续区间异或和<=k的区间,输出这个区间的范围L,R,要求这个区间最小,如果区间相同,则输出L最小的那一个。 题解: 根据性质b^b=0,所以xor_sum[i,j] = xor_sum[1,i-1] ^ xor_sum[1,j],所以用前缀异或和进行维护。 前缀异或和,我们先在字典树进行查询当前1-i区间异或和,在查找的时候,我们进行判断是否大于等于K,然后存入最小的下标。 在查询过后,在将当前异或和插入到字典树中。这样就能完成O(nlogn)的全部扫描了。 cod原创 2021-07-22 21:06:46 · 236 阅读 · 1 评论 -
2021牛客多校 Journey among Railway Stations(线段树)
题意: 一段路有n个点,每个点有一个合法区间[ui,vi],然后相邻两点之间有一个长度,问从i出发,走到j,是否使能经过每个点。有两种修改操作,修改合法区间[ui,vi],相邻点之间的长度。 题解: ...原创 2021-07-22 20:19:45 · 220 阅读 · 0 评论 -
2019ICPC银川 Pot (线段树)
2019银川区域赛 /* * @Author: 0iq * @LastEditTime: 2021-07-16 18:05:03 * @CSDN blog: https://blog.csdn.net/acm_durante * @E-mail: 1055323152@qq.com * @ProbTitle: */ #include <bits/stdc++.h> using namespace std; typedef long long ll; #define rep(i, a原创 2021-07-16 18:33:49 · 130 阅读 · 0 评论 -
2021ccpc东北四省D思维线段树
每个数最多取log次就会编程10000(2),如果是这种数字的话直接可以打一个标记,我们直接乘2,这样不必每个数都加lowbit 传送门 /* * @Author: 0iq_love_zy * @LastEditTime: 2021-06-16 17:55:19 * @CSDN blog: https://blog.csdn.net/acm_durante * @E-mail: 1055323152@qq.com * @ProbTitle: */ #include <bits/stdc+原创 2021-06-16 17:58:15 · 1330 阅读 · 0 评论 -
2021ccpc黑龙江省赛A题(吉司机线段树)
吉司机线段树处理按位与的模板题 #pragma GCC optimize(2) #pragma GCC optimize(3) #include <bits/stdc++.h> using namespace std; typedef long long ll; #define rep(i, a, n) for (int i = a; i <= n; i++) #define per(i, a, n) for (int i = n; i >= a; i--) #define lowb原创 2021-06-15 16:13:00 · 1235 阅读 · 2 评论 -
点分治题单
点分治中重点需要注意: 统计ans的时候,一定要注意子树中的ans和当前根节点的ans的处理关系 切记要注意重心的处理 一、P3806 【模板】点分治1 思路: 将一颗子树的点到根的距离存入到一个栈中,这个栈维护当前重心的所有子树的距离信息 我们在得子树点到根信息后,我们在枚举进行距离的判断,我们判断完再进行信息的入栈。 code: /* * @Author: 0iq_love_zy * @LastEditTime: 2021-02-21 18:35:44 * @CSDN blog: http原创 2021-02-23 20:13:09 · 267 阅读 · 0 评论 -
Codeforces Round #401 (Div. 2) E. Hanoi Factory(贪心 + 单调栈)
E. Hanoi Factory 题意: 给你nnn个汉诺塔,每个汉诺塔有三个数aaa,bbb,hhh,分别代表内径,外径,和高。现在让你将这nnn个汉诺塔根据以下规则叠加起来,使其的总高最高。 规则: 已经放好的汉诺塔的外径bbb要符合非递增,如bi>bjbi > bjbi>bj,这样jjj才有可能叠加到i上。 ai<bjai < bjai<bj,同时满足1,2规则才能将jjj叠放到iii上。 题解: 贪心 + 单调栈 我们将单调栈看着做已经叠加好的汉诺塔。 我们原创 2020-09-30 20:57:35 · 207 阅读 · 0 评论 -
The xor-longest Path(位运算 + 树形DP + 字典树)
The xor-longest Path 一、题意 给你一棵n个节点的树,树的边都有权值,从树中选取两个节点x,y,使得从x到y的路径上边的权值的异或最大。 二、题解 异或存在一个性质,1^1 = 0,所以从x到y的异或 = 从x到根的异或 ^ 从y到根的异或。 我们先dfs求一下每个节点到根的异或。 再用创建逆序字典树,求解最大的异或即可。 三、Accode /* * @Author: NEFU_马家沟老三 * @LastEditTime: 2020-09-12 13:59:36 * @CSDN原创 2020-09-12 14:00:40 · 169 阅读 · 0 评论 -
Palindrome(字符串Hash + 二分)
Palindrome 一、题意 给你个字符串,输出回文字符子串的最大长度。 二、思路(非马拉车) 用Hash字符串在O(1)时间内匹配,预处理正序,逆序的Hash数值。 我们枚举字符串的中点P:半径为R,当为奇数,HashRight[P−RHashRight[ P - RHashRight[P−R ~ P−1]==HashLift[N−(P+R)+1P - 1]==HashLift[N - (P + R) + 1P−1]==HashLift[N−(P+R)+1 ~ N−(P+1)+1]N - (P +原创 2020-09-09 10:54:27 · 225 阅读 · 0 评论 -
Snowflake Snow Snowflakes(Hash + 链式前向星)
一、题意 每片雪花是由6个角组成,每片雪花的6个角由顺时针的顺序给出,当两片雪花顺时针或逆时针的角度相同时,则为雪花是同一片雪花。问n片雪花中是否有相同的雪花。 二、题解 我们定义HashHashHash函数Hash=Hash =Hash=(∑i=16ai+∏i=16ai)modp(\sum_{i = 1}^{6}ai+\prod_{i = 1}^{6}ai)mod p(∑i=16ai+∏i=16ai)modp。 当两片雪花的Hash相同时,我们则进一步来根据顺序来判断这两片雪花的角度是否完全一致。原创 2020-09-06 17:13:10 · 388 阅读 · 0 评论 -
RMQ—ST表
一、简介 ST算法应用于RMQ问题,能在O(nlogn)内预处理,O(1)时间查询。 思想:应用倍增的思想,选取2的次幂为代表值。 二、预处理ST_prework() 设立dp[i][cnt]dp[i][cnt]dp[i][cnt]代表从iii到i+2cnt−1i + 2 ^{cnt} - 1i+2cnt−1中最大的值。 我们将其从中间分成两部分dp[i][cnt−1]dp[i][cnt - 1]dp[i][cnt−1]和dp[i+2cnt−1][cnt−1]dp[i + 2^{cnt - 1}][cnt原创 2020-08-27 00:29:13 · 140 阅读 · 0 评论 -
一维线段树详解
一、线段树的概念 线段树是用于区间处理的高效的数据结构,用二叉树来进行实现。 它主要分为两个步骤:修改和查询。 查询与修改的时间复杂度为O(lognlognlogn)。 二、线段树的构造 我们利用递归来进行构造,从区间为(111,nnn)的下标为111的根开始递归。最终完成构造。 伪代码: void push_up(int rt) //传递给父亲结点 { tree[rt] = tree[rt << 1] + tree[rt << 1 | 1];//左子节点,右子节点 }原创 2020-07-08 22:25:33 · 314 阅读 · 0 评论 -
树状数组
一、树状数组简析: 利用数的二进制特性新型检索的树状结构,重点是代码短,但是可操作性不如线段树。 二、lowbit()操作 代码:lowbit(x) = x & -x; 功能找到x的二进制数的最后一个1。 图: 三、一维树状数组 #define lowbit(x) ((x) & -(x)) int tree[];//tree数组 int n;//数据范围 void update(int x, int d)//更新树状数组 { for (int i = x; i <= n;原创 2020-07-01 21:15:00 · 112 阅读 · 0 评论 -
双向链表(非STL)
手工双向链表原创 2020-04-01 18:28:16 · 219 阅读 · 0 评论 -
高级数据结构之二叉树
一、二叉树的分类和其性质 二叉树的第iii层最多有2(i-1)个结点。 满二叉树:所有层的节点都是满的。一个nnn层的二叉树,共有2n−12^n-12n−1个结点。 完全二叉树:仅在最后一层有缺失结点,但缺失的结点编号都在最后。 二、完全二叉树的性质 设节点数量为kkk,1号为根节点,iii为编号。 i>1i>1i>1的结点,其父节点是i/2i/2i/2; 若2∗i&g...原创 2020-03-08 17:57:16 · 417 阅读 · 1 评论 -
优先队列priority_queue
一、简介: 头文件:#include <queue> 一般用来解决一些贪心问题,其底层是用堆来实现。 最高优先级始终在队首(可以自定义优先级)。 二、优先队列的使用: 1、定义和访问: 定义: 定义:priority_queue<Type, Container, Functional> Type 就是数据类型,Container 就是容器类型(Container必须...原创 2020-02-03 21:56:39 · 200 阅读 · 0 评论 -
带权并查集讲解
一、带权并查集讲解 1、简介: 带权并查集是一种储存子与根之间的特定关系的数组,应用范围比普通的并查集更为广泛。这时需要设立个数组D[] 来维护 子与根之间的关系。 不多说,直接上图更好理解。 2、普通并查集与带权并查集的区分: 普通并查集是用来维护相同属性集合的。 带权并查集可以用来维护不同属性集合,比如性别,上下级关系,食物链关系等等(下面会有例题的讲解)。 3、难点: 问题: 如...原创 2020-01-31 18:14:21 · 628 阅读 · 1 评论 -
高级数据结构之并查集
一、基础版并查集: 基本步骤:初始化、不断合并的过程中查找、统计集合。 树状图: #include <bits/stdc++.h> using namespace std; const int maxn = 1005; int s[maxn]; void init_set(int n)//初始化 { for (int i = 1; i <= n; i++) ...原创 2020-01-27 10:04:21 · 201 阅读 · 0 评论 -
STL容器之next_permutation()及其相关知识
next_permutation()从小到大 一、介绍: 作用:排列组合的函数,并按字典序返回。 在使用之前,先用sort给数据排序,然后再使用。 二、应用: 定义:bool next_permutation(first,last);first是指:数组的起始,last是指数组的末端; int num[10]={0,1,2,3,4,5} bool next_permutation...原创 2020-01-16 15:16:36 · 221 阅读 · 0 评论 -
STL容器之stack和queue
stack 简介 栈:先进后出。 头文件#include <stack> 相关操作 定义:stack<Type>s; 把a存到栈顶:s.push(a); 返回栈顶元素(不会删除):s.top(); 删除栈顶元素:s.pop(); 返回栈中元素的个数:s.size(); 检查栈是否为空,若为空返回ture:s.empty(); queue 简介: 特点:先...原创 2020-01-16 10:28:28 · 124 阅读 · 0 评论 -
在C++中STL的迭代器使用
简介 迭代器是遍历容器内的数据类型,跟指针类似,指向的是容器内的某个元素。 作用:读取、修改容器内的元素。 string,vector,map,list在c++中都有对应的迭代器。 不同类型迭代器及其相关使用: 一、string类: 1、定义: string s1; string::iterator it; 2、相关操作 指向字符串s1第一个字符的位置:s1.begin(); 指向字符串s...原创 2020-01-15 11:45:22 · 157 阅读 · 0 评论 -
STL容器之vector、set、map
简介 vector是STL的动态数组,在运行时能改变数组大小,能存放任何类型的对象。 一、定义: 1.定义int型数组: vector<int> a;默认初始化,a为空。 vector<int> b(a);用a来定义b。 vector<int> a(100);有100个值为0的元素。 vector<int> a(100,6);有100个值为6的...原创 2020-01-12 21:36:19 · 534 阅读 · 0 评论 -
2020.01.10 STL容器之stack(栈)
栈 简介 栈在STL容器中实现的是一个后进先出的容器。 头文件:#include <stack>,同时必须要有using namespace std。 定义stack:stack<<typename> name,其中typename可以是任何基本类型或者容器(int,long long ,char .string ,struct)均可,name是栈的名字(自己起的名...原创 2020-01-10 18:44:12 · 276 阅读 · 0 评论 -
2020.1.10队列(数组模拟)
队列 简介 队列“先进先出”,类似生活中于先来先买,后来后买。 队头(front)、队尾(rear)。 队列的几种状态: 队空:队列中没有任何元素。 队满:队列空间已全被占用。 溢出:上溢(overflow),下溢(underflow)。 一、队列的基本操作。 1.初始化 初始化状态为front=rear=0,即队列里没有任何元素。 void clear(){ front = r...原创 2020-01-10 14:57:43 · 441 阅读 · 0 评论