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 · 176 阅读 · 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 · 225 阅读 · 1 评论 -
2021牛客多校 Journey among Railway Stations(线段树)
题意:一段路有n个点,每个点有一个合法区间[ui,vi],然后相邻两点之间有一个长度,问从i出发,走到j,是否使能经过每个点。有两种修改操作,修改合法区间[ui,vi],相邻点之间的长度。题解:...原创 2021-07-22 20:19:45 · 212 阅读 · 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 · 120 阅读 · 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 · 1318 阅读 · 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 · 1220 阅读 · 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 · 258 阅读 · 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 · 197 阅读 · 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 · 156 阅读 · 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 · 218 阅读 · 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 · 379 阅读 · 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 · 133 阅读 · 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 · 308 阅读 · 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 · 105 阅读 · 0 评论 -
双向链表(非STL)
手工双向链表原创 2020-04-01 18:28:16 · 211 阅读 · 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 · 403 阅读 · 1 评论 -
优先队列priority_queue
一、简介:头文件:#include <queue>一般用来解决一些贪心问题,其底层是用堆来实现。最高优先级始终在队首(可以自定义优先级)。二、优先队列的使用:1、定义和访问:定义:定义:priority_queue<Type, Container, Functional>Type 就是数据类型,Container 就是容器类型(Container必须...原创 2020-02-03 21:56:39 · 195 阅读 · 0 评论 -
带权并查集讲解
一、带权并查集讲解1、简介:带权并查集是一种储存子与根之间的特定关系的数组,应用范围比普通的并查集更为广泛。这时需要设立个数组D[] 来维护 子与根之间的关系。不多说,直接上图更好理解。2、普通并查集与带权并查集的区分:普通并查集是用来维护相同属性集合的。带权并查集可以用来维护不同属性集合,比如性别,上下级关系,食物链关系等等(下面会有例题的讲解)。3、难点:问题:如...原创 2020-01-31 18:14:21 · 609 阅读 · 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 · 193 阅读 · 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 · 208 阅读 · 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 · 120 阅读 · 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 · 150 阅读 · 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 · 519 阅读 · 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 · 266 阅读 · 0 评论 -
2020.1.10队列(数组模拟)
队列简介队列“先进先出”,类似生活中于先来先买,后来后买。队头(front)、队尾(rear)。队列的几种状态:队空:队列中没有任何元素。队满:队列空间已全被占用。溢出:上溢(overflow),下溢(underflow)。一、队列的基本操作。1.初始化初始化状态为front=rear=0,即队列里没有任何元素。void clear(){ front = r...原创 2020-01-10 14:57:43 · 422 阅读 · 0 评论