数据结构
文章平均质量分 56
1
_九磅十五便士_
这个作者很懒,什么都没留下…
展开
-
AtCoder Beginner Contest 259 D - Circumferences(并查集)
并查集原创 2022-07-10 16:48:07 · 484 阅读 · 0 评论 -
2021 ICPC网络赛I-A Busiest Computing Nodes(线段树)
题意现在给你若干个机器nnn和若干组需求mmm,每一个需求的第一个数是开始时间,第二个数字是持续时间,现在对于每一组需求(第iii组需求,我们需要优先安排到第i%ni\%ni%n的机器中,如果当前时间机器正在工作中,那么挪到(i+1)%n(i+1)\%n(i+1)%n个,以此类推,如果当前我们要开始的时间发现所有的机器均在工作,那么当前需求作废,看下一个)。输入的第一行是n,mn,mn,m接下来的mmm行代表需求的个数,每一行的第一个数代表当前需求的开始时间,第二个数代表当前需求要进行的时间。(持..原创 2021-09-20 21:12:08 · 497 阅读 · 2 评论 -
CF1558A Charmed by the Game(STL)
题目传送门考察set的用法,可以注意迭代器遍历。#include <iostream>#include <string>#include <vector>#include <set>#include <algorithm>using namespace std;int sum[2102100];int a[2102100];int b[2102100];int main(){ ios::sync_with_stdio原创 2021-09-05 10:46:45 · 255 阅读 · 0 评论 -
CF1549D Integers Have Friends(st表+二分/双指针)
题目传送门题意这道题让你找一个最长的区间,这个区间里面的每一个数,都要对于m>=2m>=2m>=2同余思路这道题用到一个同余的性质如果 x≡y(modp)x≡y(mod p)x≡y(modp)那么(x−y)(x-y)(x−y)%p=0p=0p=0那么对于一整个区间来说,我们只要满足这个区间的差分数组不互质就可以。因此问题就转换成为了,维护一个差分数组,找到最长的不互质的子序列。因此我们就要用到二分+st表,如果想优化你也可以双指针(100ms的优化)同时这道题用scan原创 2021-08-02 20:45:27 · 529 阅读 · 0 评论 -
2021牛客多校5-King of Range(单调队列/ST表+假的二分)
这个题可以用ST表写,但是我很荣幸地收获了TLE,下面我把我的代码贴在下面。#include<iostream>#include<cmath>using namespace std;typedef long long ll;int st[2102100][30];int sta[2102100][30];int k;int checka(int i,int mid){ int k=log2(mid-i+1); return max(st[i][k],st[mi..原创 2021-07-31 22:37:50 · 446 阅读 · 1 评论 -
CF689D Friends and Subsequences(ST表+二分)
题目传送门题意给定序列 aaa 和序列 bbb,长度均为 nnn。问有多少组 (l,r)(l,r)(l,r),满足 1≤l≤r≤n1\le l\le r\le n1≤l≤r≤n 且maxi=lrai=mini=lrbi\max_{i=l}^r a_i=\min_{i=l}^r b_ii=lmaxrai=i=lminrbi1≤n≤2×1051\le n\le 2\times 10^51≤n≤2×105,∣ai∣,∣bi∣≤109|a_i|,|b_i|\le 10^9∣ai∣,∣bi∣原创 2021-07-30 15:31:17 · 390 阅读 · 0 评论 -
CF438D The Child and Sequence(线段树)
题目传送门和这道题极为相似的还有一道题如下P4145 花神游历各国给出一个长度为 nnn 的序列 aaa ,有 mmm 个操作 (1≤n,m≤105;1≤a[i]≤109)(1 \le n,m \le 10^5;1 \le a[i] \le 10^9)(1≤n,m≤105;1≤a[i]≤109) ,分为以下三种:1 l r1 \ l \ r1 l r:查询序列中区间 [l,r][l,r][l,r] 的和。 (1≤l≤r≤n)(1 \le l \le r原创 2021-07-13 11:00:44 · 114 阅读 · 0 评论 -
AcWing 255. 第K小数(主席树入门)
题目传送门因为可持久化线段树和普通线段树的区别,因此我们不能像普通线段树那样按照二叉树来查找,因此我们应该使用一个指针来开点。根据可持久化的要求,插入新版本时,先复制原节点,然后改变的节点来重新开点,不改变的节点按照原来的连接方式。那么这道题为什么我们想到要用主席树呢?原因还是因为我们使用的是权值线段树,会发现以值域作为区间的权值线段树,长的样子一模一样,只是节点的权值不一样,因此两颗这压根的线段树是可以相减的,但是我们这道题需要记录一个历史版本和一个全新版本,如果按照正常线段树那么空间肯定爆表。原创 2021-07-05 17:39:39 · 120 阅读 · 0 评论 -
字典树(Tire)及其拓展
一般树形结构都是需要指针来实现,但是在算法竞赛的过程中,使用传统指针的运行效率十分慢,因此我们通常使用一个数据idx来分配一个值来代替指针。普通字典树字典树也叫做前缀树,每个字符占据一个节点,拥有相同前缀的字符串可以共用部分节点一般的字典树只有两种操作方式:插入和查询。字典树要存放的一些信息int t[1000010][26],cnt[1000010],idx;idx就是指针,其中idx=0代表根节点(不存放任何信息)t[N][26]:代表以当前指针值能够连接的字母的指针值。cnt[N]原创 2021-07-03 12:29:18 · 237 阅读 · 1 评论 -
POJ 2528 Mayor‘s posters(线段树+思维)
题目传送门题目大意思路原创 2021-06-10 19:05:03 · 80 阅读 · 0 评论 -
线段树入门
单点修改的线段树线段树的建树建树:代表对你的线段树进行初始化,那么这个结构体的每一个值都要在build函数里面进行初始化赋值。p代表二叉树访问到哪一个节点l和r代表线段树当前而二叉树结点的左右端点void build(int p,int l,int r){//p代表二叉树访问到哪一个节点 if(l==r){//访问到叶子节点 tr[p]={l,l,w[l]}; }else { tr[p].l=l,tr[p].r=r;//一定要注意给每一个二叉树分支进行初始化 int mid=l+r原创 2021-06-07 15:27:13 · 78 阅读 · 0 评论 -
你能回答这些问题吗(线段树)
题目传送门#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>using namespace std;typedef long long ll;const int N=510210;struct Segmentree{ int l,r; int lmax,rmax;//分别是最大后缀和和最大前缀和 int tot;//本区间的连续子段和的最大值 i原创 2021-06-01 16:10:54 · 90 阅读 · 0 评论 -
谜一样的牛(树状数组)
题目传送门思路我现在有一组数据50 1 2 1 0那么从后往前看第五个数也就是代表了所有的数中,从小到大排序排名第1的数字,然后把这个数删掉第四个数也就是代表了剩下的所有的数中,从小到大排序排名第2的数字,然后把这个数删掉第三个数也就是代表了剩下的所有的数中,从小到大排序排名第3的数字,然后把这个数删掉第二个数也就是代表了剩下的所有的数中,从小到大排序排名第2的数字,然后把这个数删掉第一个数也就是代表了剩下的所有的数中,从小到大排序排名第1的数字,然后把这个数删掉那么可以用树状数组来直原创 2021-05-22 23:23:59 · 80 阅读 · 0 评论 -
关于两道树状数组题目的辨析
题目1 easy version题目2 hard version题意辨析这两道题区别在于easy version是将某一个数加上了x,而hard version是将每一个数都加上了x,虽然最后都让求的区间和…思路题目一当然简单了,开一个树状数组tree直接记录一下tree[l]+=xtree[r+1]-=x这样到最后用前缀和算一遍就直接出来了思维量还是比较低的#include<iostream>using namespace std;const int N=5e5+7;in原创 2021-05-22 22:08:22 · 108 阅读 · 0 评论 -
楼兰图腾(树状数组)
题目传送门思路以后但凡你能看到一道题可以:修改某个数,或者求前缀和那么都可以考虑使用树状数组这道题的思路感觉总体上和求逆序对的感觉上差不多总体上你可以在坐标轴上画一画,数出来构成V字形和倒V字形的3个数据的个数。那么每一次我去找每一个数的左边比他大的乘上右边比它大的,然后求出所有的这样的和,就是我们要找到的V字形的组数反之同理,那就找小的。那么如何找就是一个问题了:可以顺序遍历一遍,把在左边比它小的/大的分别用数组记录下来然后再倒叙遍历一遍,把在右边比它小的/大的,和原数组相乘起来,乘原创 2021-05-21 20:28:47 · 81 阅读 · 0 评论 -
P1908 逆序对(树状数组)
题目传送门对于逆序对,可以用树状数组来求,而树状数组就是求出所有的非逆序对,答案当然就是所有情况减去非逆序对了。举个栗子1 3 5 2 4首先输入1,那么在树状数组角标1的位置加入1,3,5同理这样在加入3的时候,求出前面有一个和它非逆序5的时候发现前面有两个数和它非逆序2的时候发现前面有一个数和它非逆序4的时候发现前面有三个和它非逆序那么答案就是从5个数中选两个的组合数-非逆序对数就是10-7=3树状数组的一些操作:lowbitlowbitlowbit操作ll lowbit(ll原创 2021-05-20 13:52:57 · 212 阅读 · 2 评论 -
POJ 1426 Find The Multiple (BFS/二叉树+数论)
题目传送门bfs的搜索树,也是一种完全二叉树。又知道:a∗ba*ba∗b%m=(am=(am=(a%m∗bm*bm∗b%m)m)m)%m;m;m;(a(a(a%m+bm+bm+b%m)m)m)%m=(a+b)m=(a+b)m=(a+b)%m;m;m;本题的数字又是由一位一位的0/10/10/1串组成的。因此:(((0/1)∗1+(0/1))∗10+(0/1))∗100(((0/1)*1+(0/1))*10+(0/1))*100(((0/1)∗1+(0/1))∗10+(0/1))∗100%n=原创 2021-04-06 20:18:11 · 102 阅读 · 0 评论