数据结构
文章平均质量分 60
林苏泽
很多时候终点看着很远,实际也很远,但只要你不向它跑去,他永远都很远,所以只有你向它跑去,才能更接近它,所以加油,向前奔跑吧,即使最后没有到达所想的终点,但我想也不会差。起码我们已经比别人距终点近了好多。
展开
-
7-3 树的同构 (25 分)
思路:首先我们了解到它是如何是同构的?就是左右孩子可以互换,要不不换,那么唯一不变的是他们都是父亲节点的孩子,那么我们直接标记两个孩子,记录这两个孩子的父亲即可。这样我们用pair存放两个孩子,就是不管他左还有右。只记录他的父亲节点,然后用第二棵树去验证。这里需要特判只有一个节点时。直接判断这个节点是同一个吗就行。#include <bits/stdc++.h>using namespace std;#define pii pair<char,char>map<.原创 2022-04-11 18:50:54 · 325 阅读 · 0 评论 -
CF1420D Rescue Nibel (贪心+思维)
链接题意:有 nnn 条线段 [li,ri][l_i,r_i][li,ri],你需要从中选出 kkk 条令他们的交集不为空,求方案数对 998244353998244353998244353 取模的结果。分析:看完题我们还知道求交集,那么求交集一定是max(li,lj)<=min(ri,rj)max(l_i,l_j)<=min(r_i,r_j)max(li,lj)<=min(ri,rj)这样交集才不为空,所以我们可以先按左节点排序,右节点排序,排序完我们知道左节点一定会原创 2021-11-16 19:28:48 · 331 阅读 · 0 评论 -
2018icpc青岛F . Tournament (构造)
题意:给出n个骑士,进行k次对战,每个骑士只能与另一个骑士对战一次,如果第i回合A对战B,C对战D,那么如果第j回合A对战C(D),那么B一定对战D©。问是否可能构成k场对局。字典序从小到大。分析:我们看最小的字典序,也就是我们想到的最优的不过就是1 2 3 4 5 6 7 8 (然而这个不能用,本人不能跟本人对战)2 1 4 3 6 5 8 7 (那么我们只好选优,肯定12互换,34互换)3 4 1 2 7原创 2021-11-03 20:08:57 · 502 阅读 · 1 评论 -
ABC 223 A~F (C尺取,D拓扑排序,E思维,F分块)
链接A Exact Price对n取余看是否为0,注意特判0.B String Shifting找最小,最大,我们发现他是有个环形的字符串那么我们可以把n个字符串提取出来,排序即可。C - Doukasen我们从两端往中间走,看那一端先到交界处这段就要向前走下一块,速度会变,到了交界处另一端减去当前时间走的即可(速度不变),所以我们只需要比较走过两端最后一块的时间为多长,取小的即可。长度用double用ll是不对的哦ll n,m; struct node{ double a, b原创 2021-10-19 20:39:22 · 340 阅读 · 0 评论 -
ABC 221 E - LEQ (树状数组)
链接题意:给出你一个长度为nnn的序列,然后让你从中找出子串要求第一个数比最后一个小,要求找出的子串求方案数?分析:首先我们肯定是要找两个数符合条件的两个数。确定这两个数之后,其中的方案数就是(2j−i2^{j-i}2j−i)方案, 就是从中间选0,1,2,3,…都选,一共这么多方案数。当我们枚举一个数,然后比他小的数有多少个时,我们肯定想到用树状数组来维护。然后剩下的问题,就是如何维护这个方案数2j−i2^{j-i}2j−i我们看 答案应该是∑2j−i=∑2j2i)\sum2^{j-i}=\su原创 2021-10-05 17:54:55 · 248 阅读 · 0 评论 -
倍增与ST算法
文章目录倍增ST算法[P2880 [USACO07JAN]Balanced Lineup G](https://www.luogu.com.cn/problem/P2880)倍增很好理解,就是成倍增加,相当于每次乘2,所以倍增通常可以与二进制位运算联系起来。倍增法的特点是需要提前计算出第1、2、4、…、2k1、2、4、…、2^k1、2、4、…、2k 个跳板,这要求数据是静态不变的,不是动态变化的。如果数据发生了变化,所有跳板要重新计算,跳板就失去了意义。 倍增法的经典应用有:矩阵快速幂、后缀数组、原创 2020-12-12 22:01:27 · 423 阅读 · 0 评论 -
CF 1420 C2. Pokémon Army (hard version) (思维|线段树)
链接题意:给出一个序列 aaa,要求求出一个单调递增的下标序列 bbb,使得 ans=ab1−ab2+ab3−ab4+⋯ans=a_{b_1}-a_{b_2}+a_{b_3}-a_{b_4}+\cdotsans=ab1−ab2+ab3−ab4+⋯最大,输出这个最大值。接下来有 qqq个操作,每个操作为一个二元组 (l,r)(l,r)(l,r),交换 ala_lal 与 ara_rar 。求出交换后最大的 ansansans。多组数据。注意:每组数据读入时先是 nnn 和 qqq原创 2021-08-26 12:59:35 · 166 阅读 · 0 评论 -
ARC 125 D - Unique Subsequence (树状数组+DP+字符串)
链接题意:给定长度为nnn的序列aaa,问有多少aaa的子序列bbb,满足在aaa的子序列中只出现一次。分析:首先我们看到,子序列,那么我们想到如何使他唯一,我们发现,如果 我们找到以x结尾的子序列,在后面还有x那么一定不是唯一的, 举个例子1 2 11 3 4 5 6 3 4 我们以3结尾,1 2 11 3 在其后第8个位置还有一个3所以还可以1 2 11 3(8).这样就不符合条件。那么我们只能考虑同样数字最后一个位置。这样才能保证只出现一次。如果出现ai,aja_i,a_jai,aj相原创 2021-08-26 11:14:14 · 324 阅读 · 0 评论 -
AtCoder Beginner Contest 212 D - Querying Multiset (优先队列+思维)
链接题意:三种操作:向队列中放入一个x将队列中的数都+x拿出队列中最小的数,并输出。分析:首先我们知道本题的难点在于维护每次给队列中的数+x因为队列中的数加入的顺序不一样,所以第2种对队列中的贡献有的多有的少,(我说的不太清楚,谨慎理解)。然后为了解决这个问题,我们可以将其转化成这样的每次加上数我们用sum维护出来,之后,当我们进行第一种操作时,加入新数x,我们将起拆解成两...原创 2021-07-31 22:30:00 · 175 阅读 · 0 评论 -
CF B. Little Elephant and Array (暴力剪枝|莫队|线段树|树状数组)
链接题意:小象喜欢和数组玩。现在有一个数组 aaa,含有 nnn 个正整数,记第 iii 个数为 aia_iai 。现在 mmm个询问,每个询问包含两个正整数 ljl_jlj 和 rjr_jrj;(1⩽lj⩽rj⩽n)(1\leqslant l_j\leqslant r_j\leqslant n)(1⩽lj⩽rj⩽n),小象想知道在 AljA_{l_j}Alj 到 ArjA_{r_j}Arj 之中有多少个数 xxx,其出现次也为 xxx。暴力剪枝:说是暴力剪枝其实也不是原创 2021-08-11 12:26:39 · 179 阅读 · 1 评论 -
最大子序和(数组模拟单调队列)
问题 B: 最大子序和题目描述输入一个长度为n的整数序列,从中找出一段不超过M的连续子序列,使得整个序列的和最大。例如 1,-3,5,1,-2,3当m=4时,S=5+1-2+3=7当m=2或m=3时,S=5+1=6输入第一行两个数n,m第二行有n个数,要求在n个数找到最大子序和输出一个数,数出他们的最大子序和样例输入 Copy6 41 -3 5 1 -2 3样例输出 Copy7提示30%满足 n,m<=10050%满足 n,m<=3000100%满足n,m&原创 2020-11-30 16:33:55 · 167 阅读 · 0 评论 -
队列,堆,栈总结
队列总结基础队列双端队列 _ ___ _______| |/ (_) |___ / || ' / _ _ __ __ _ / /| |__ __ _ _ __ __ _| < | | '_ \ / _` | / / | '_ \ / _` | '_ \ / _` || . \| | | | | (_| |/ /__| | | | (_| | | | | (_| ||_|\_\_|_| |_|\__, /_____|_| |_原创 2020-10-18 15:11:17 · 321 阅读 · 0 评论 -
最大值(单调栈)
问题 D: 最大值时间限制: 1 Sec 内存限制: 128 MB[提交] [状态]题目描述给出N个整数,和一个长度值Len,要求在这N个整数中每个长度为Len的连续一段数中的最大值。例如:N=8,Len=3,8个整数是:2 5 1 1 2 4 7 1。答案是 5 5 2 4 7 7 。解释:2 5 1的最大值是55 1 1的最大值是51 1 2的最大值是21 2 4的最大值是42 4 7的最大值是74 7 1的最大值是7输入第一行2个正整数:N,Len。N范围[原创 2020-11-30 16:49:43 · 433 阅读 · 0 评论 -
对顶堆
不竭尽全力去做一件事,你永远不知道,你会有多优秀,加油对顶堆定义 :用途:定义 :其实就是两个堆,讲一个堆倒过来,让其看一看成一个堆的排序借用一下图形就是这样子的如果上面是大根堆下面是小根堆的话,整体来说就是小跟堆反过来 上面是小根堆下面是大根堆的话,整体就是大根堆;用途:我目前知道的就是不断地找到第几大,第几小,就是求得是个变化的值;慢慢发掘吧。先举个栗子吧:P1801 黑...原创 2020-04-05 00:08:52 · 770 阅读 · 0 评论 -
A. 接力
A. 接力接力共有n名队员(编号1−n)参加,在同一时刻赛道上允许有任意多名选手同时赛跑。比赛开始前,所有交警在起跑线等待起跑。在t=0时刻,编号为1的选手开始赛跑,L1秒后跑完一圈回到起点。当选手i跑完一圈他会示意Mi名选手开始接力。(选手可能被多次示意,只算最早的示意)每个选手只跑一圈。接力的总时间为最后一个选手结束赛跑的时间。求接力的总时间。Input第一行一个单独的整数n,表示有n名选手。接下来n行,每行开始有2个整数Li,Mi,接下来有Mi个整数,表示示意选手的编号。Output一原创 2020-12-01 19:39:03 · 161 阅读 · 0 评论 -
问题 F: 二师兄的纪录片
问题 F: 二师兄的纪录片时间限制: 1 Sec 内存限制: 128 MB题目描述二师兄护送师傅取经成功之后,成了名人,他决定重新把取经的路再走一遍,并且拍摄一部纪录片宣传路上的风光。从东土大唐到天竺的地图,是正方形的,城市坐落在 N 行 N 列的方形地图上。地图从位置(1,1)排列到位置(N,N)。地图上每一个格子是一座城市,上下左右直接相邻的城市之间可以一天到达。有 P 座城市住着野蛮人(野蛮城市),他们只吃红烧肉。一天三顿红烧肉,连早餐都吃红烧肉。二师兄是出家人,决定不去这些城市。另有原创 2020-11-22 23:08:50 · 559 阅读 · 4 评论 -
队列与优先队列的总结
队列队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。因为队列只允许在一端插入,在另一端删除,所以只有最早进入队列的元素才能最...原创 2020-03-17 16:05:00 · 457 阅读 · 0 评论 -
分块 总结
分块算法:用block=nblock=\sqrt nblock=n表示块大小,用两个数组表示每块的头和尾,第i个位置表示那个位置用(i−1)/block+1(i-1)/block+1(i−1)/block+1int blck = sqrt(n);int t = n/block;if(n%block) t++;for(int i=1;i<=t;i++){ st[i] = (i-1)*block+1; ed[i] = i*block;}ed[t]=n;///最后一个是nfor(i原创 2021-08-17 18:44:48 · 113 阅读 · 0 评论 -
树状数组练习题
P5057 [CQOI2006]简单题用树状数组直接维护,结果对2取余即可。#include <bits/stdc++.h>using namespace std;const int maxn = 2e5 + 7;int n;int a[maxn], ans[maxn], tree[maxn];int lowbit(int x){ return x & -x;}void update(int x, int d){ while(x <= n.原创 2021-08-16 20:21:11 · 169 阅读 · 0 评论 -
CF 597C. Subsequences(树状数组优化DP)
链接题意:n个数让你取m+1m+1m+1个递增元素。问方案数?分析:毫无疑问DP来做但是DP来做是O(n2m)O(n^2m)O(n2m)的复杂度肯定过不去,那么我么你转变思路,用dp[i][j]dp[i][j]dp[i][j]表示以i结尾,长度为j的方案数,那么他状态由dp[小于i][j−1]dp[小于i][j-1]dp[小于i][j−1]转移过来,那么我们只要维护出来小于一个数数量有多少就可降低复杂度。那么我们就可以用树状数组维护。先维护出m+1个树状数组然后找每一个小于其前一状态。状态转移方原创 2021-08-16 13:57:44 · 216 阅读 · 0 评论 -
AcWing 楼蓝图腾(树状数组维护逆序对)
链接题意:给出你一段序列,让你找出yig9ong多少先增后减和多少先减后增的三元组。(i,j,k)(i<j<k)(i,j,k)(i<j<k)(i,j,k)(i<j<k)分析:用树状数组维护逆序对。先正序维护一个逆序对,再倒序维护逆序对,两两相乘再求和即可。#include <bits/stdc++.h>using namespace std;#define ll long long const int maxn= 2e5+7;ll n;原创 2021-08-16 11:08:50 · 149 阅读 · 0 评论 -
树状数组
中心思想是lowbit函数,int lowbit(int x){ return x&(-x);}树状数组的修改与查询int tree[maxn]void update(int x,int d){/// 修改元素ax ax=ax+d while (x < maxn){///maxn维护的总长度 tree[x] += d; ///当前用到这个数的数+d x +=lowbit(x); ///移动到下一个用到这个数的数 }}///查询:int query(原创 2021-08-14 16:24:44 · 109 阅读 · 1 评论