算法笔记
文章平均质量分 63
INGg__
双非ACM打铁选手,数据科学与大数据专业在读
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
VIT速记
【ViT论文逐段精读【论文精读】】 【精准空降到 30:29】 https://www.bilibili.com/video/BV15P4y137jb/?原创 2024-02-29 16:54:13 · 982 阅读 · 0 评论 -
CF1316C Primitive Primes
题意给定两个多项式函数f(x)=a0+a1x+⋯+an−1xn−1f(x)=a_0+a_1x+\dots+a_{n-1}x^{n-1}f(x)=a0+a1x+⋯+an−1xn−1和g(x)=b0+b1x+⋯+bn−1xn−1g(x)=b_0+b_1x+\dots+b_{n-1}x^{n-1}g(x)=b0+b1x+⋯+bn−1xn−1令h(x)=f(x)∗g(x)h(x)=f(x)*g(x)h(x)=f(x)∗g(x),c为相乘后的系数的代号,问是否存在c,使得c不能被质数p整除,问其中的一原创 2022-04-28 22:06:36 · 453 阅读 · 0 评论 -
Codeforces Round #588 (Div. 2) C D
C - Anadi and Domino题意给定21张牌,每张牌的两端有两个数字,数字1≤a,b≤61\leq a,b\leq 61≤a,b≤6给定一个无向图,选择一些牌放在条边上,要求牌朝向图上的点的那一端,如果已经有牌指向这个点,那么这个点所对的所有牌的对应的一端必须是相同的数字问最多能放多少张牌题解最多有7个点,21条边,21牌我们可以把每个边指向的那个点的编号设为牌的权,枚举看看合法的情况下最多的牌有多少张Codeint T;int n, m;int g[100][100];原创 2022-04-06 08:49:58 · 275 阅读 · 0 评论 -
BFS扩展进阶
多源BFS题意给定一个A矩阵,问所有点到该矩阵的元素为1的点的最短距离是多少题解根据BFS的性质,我们知道原本的时候只是将一个起点放进了队列中去,那么现在我们有好多个起点,我们可以把所有的起点都先放进队列中去,然后以每个起点为“山峰”进行Flood-Fill覆盖,某一个点被由某一个起点首先遍历过来的距离就是最短距离了Code// Problem: 矩阵距离// Contest: AcWing// URL: https://www.acwing.com/problem/content/des原创 2021-08-19 18:39:06 · 352 阅读 · 0 评论 -
DP模型——区间DP
前言在区间范围内做DP能使用区间DP重要的一点在于,能把所求的问题划分成两个独立的问题和可能已知的某一个最小问题,最后三个问题加起来就是答案环形DP转线性环形石子合并方法一我们最后要求的是在环形中将相邻的两堆石子来合并,即我们现有的两个相邻的石子来连边,最后会连成分成了两堆石子,再练一条边,最后一定会用到n-1条边,那么最后一定会有某两个相邻点是没有连边的,是有一个缺口的,那么我们可以枚举这个缺口来进行操作。然后把剩下的拉成一个链即可。最后的复杂度是N∗N3N*N^3N∗N3(N是枚举缺口,N原创 2021-08-11 16:38:57 · 891 阅读 · 0 评论 -
DP模型——状压DP
文章目录前言什么是状态压缩DP基本例题1前期思考状态表示状态计算Code基本例题2前期思考状态表示状态计算Code扩展棋盘式小国王思考状态表示状态计算Code玉米田前期思考状态表示状态计算Code炮兵阵地思考状态表示状态计算Code前言第200篇blog!好耶!在之前发过一个状压DP的初步blog,现在回看发现上面写的好像不是那么的好,现在在这篇把状压再写出来。当然,是按照模型的关系循序渐进的什么是状态压缩DP我的理解就是用K进制来表示所要解决问题的状态的K种状态基本例题1蒙德里安的梦想原创 2021-08-06 14:38:10 · 1403 阅读 · 0 评论 -
DP模型——状态机模型
文章目录状态机大盗阿福一般做法状态表示状态计算Code状态机状态表示状态计算Code股票买卖Ⅳ状态表示状态计算Code股票买卖Ⅴ状态表示状态计算Code设计密码状态机简单来说:把点扩成一个过程点是指某一个特定的状态,过程是指可能存在多个点之间相互转化在进行的过程中除了定义好状态,还要对状态入口和出口进行思考确定最后总结一句:绝了!大盗阿福有 N 加店铺,不能抢劫两家相邻的店铺,问抢劫的最大价值是多少一般做法状态表示f[i] 表示前 i 家的最大收益状态计算对于第 i 家店铺来说,原创 2021-07-29 21:15:27 · 1816 阅读 · 0 评论 -
DP模型——背包模型 03 (混合、有依赖、背包状态初始化)
文章目录混合背包有依赖的背包状态表示属性状态计算Code状态联系求价值(价值最值)初始化求方案数的初始化混合背包有 N 种物品和一个容量是 V 的背包。物品一共有三类:第一类物品只能用1次(01背包);第二类物品可以用无限次(完全背包);第三类物品最多只能用 si 次(多重背包);每种体积是 vi,价值是 wi。求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。输出最大价值。分类讨论// Problem: 混合背包问题// Contest: AcWing原创 2021-07-28 21:38:14 · 232 阅读 · 0 评论 -
DP模型——背包模型 02 (完全、多重、二维费用、分组)
文章目录完全背包方案数买书货币系统货币系统(NOIP)题意题解多重背包庆功会二维费用背包板子潜水员状态表示属性状态计算Code2021山东省赛分组背包问题机器分配金明的预算方案完全背包方案数买书即求不超过n元钱的方案数优化也是跟求最值的完全背包一样f[i][j]=f[i−1][j]+f[i−1][j−1∗v[i]]+⋯f[i][j]=f[i-1][j]+f[i-1][j-1*v[i]]+\cdotsf[i][j]=f[i−1][j]+f[i−1][j−1∗v[i]]+⋯变形为f[i][j]=f[原创 2021-07-28 21:31:16 · 961 阅读 · 0 评论 -
DP模型——背包模型 01 (01背包类型)
文章目录大纲前置知识前言01背包纯板子采药装箱问题阅读理解宠物小精灵(也属于二维背包)输入格式输出格式背包问题求方案数板子状态表示数字组合状态表示属性状态计算Code具体方案简单应用开心的金明结合能量石大纲这个关系不是特别正确,但不妨碍我们来讲前置知识01背包、完全背包、分组背包、多重背包①、多重背包②直接放以前发的 博客 了前言对于背包问题,本质上就是有限制的选择问题对于给定的物品选还是不选01背包纯板子采药没啥说的// Problem: 采药// Contest: AcWi原创 2021-07-28 21:26:58 · 1465 阅读 · 0 评论 -
多重背包 单调队列优化
多重背包 单调队列优化首先根据我们在前面分析的多重背包和完全背包的状态计算可以知道,多重背包只能选有限个,而完全背包可以选无限个,他们俩的上限一个是枚举到上限为止,一个是枚举到不能放了为止。那么根据这个图,我们是可以根据单调队列来解决这个问题的f[j] 是由所有同余与 v 的值转移过来的,比如现在有一个物品 v 是3,那么f[0],f[1],f[2]是三个不同的同余类,对于f[0], f[3], f[6], f[9]是一个同余类注意上面的图,每一个滑动窗口的原始值都比原来多 w参考了三篇blo原创 2021-07-24 18:23:31 · 530 阅读 · 0 评论 -
最长上升子序列模型
拦截导弹某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。输入导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数,导弹数不超过1000),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。这个题第一问很简单,让我们求一个最长不上升原创 2021-07-18 17:26:39 · 254 阅读 · 1 评论 -
数位DP初步
给定两个整数 a 和 b,求 a 和 b 之间的所有数字中 0∼9 的出现次数。例如,a=1024,b=1032a=1024,b=1032,则 a 和 b 之间共有 9 个数如下:1024 1025 1026 1027 1028 1029 1030 1031 1032其中 0 出现 10 次,1 出现 10 次,2 出现 7 次,3 出现 3 次等等…我们可以构造这样一个函数count(n,x)求出来1~n中x出现的次数,通过类似前缀和的公式来得到另一个区间的个数那么怎么求出来呢,分情况讨论.原创 2021-07-17 00:38:39 · 211 阅读 · 0 评论 -
计数类DP初步
整数划分一个正整数 nn 可以表示成若干个正整数之和,形如:n=n1+n2+…+nk,其中 n1≥n2≥…≥nk,k≥1。我们将这样的一种表示称为正整数 n 的一种划分。现在给定一个正整数 n,请你求出 n 共有多少种不同的划分方法。这个问题也可以看成完全背包问题,有n个物品,容量为n的背包,每个物品的价值是1~n,每个物品可以有无限个状态转移方程就是:f[i][j]=f[i−1][j]+f[i][j−1∗i]f[i][j] = f[i - 1][j] + f[i][j-1 * i]f[i][.原创 2021-07-16 13:48:34 · 226 阅读 · 2 评论 -
数论之互质与欧拉函数
文章开始前先给大家安利我学长以前写的数论的blog:aliayc文章目录互质欧拉函数质因数分解筛法求欧拉函数性质积性函数定义性质题目互质定义∀a,b∈N,若gcd(a,b)=1,则称a,b互质\forall a,b \in N,若gcd(a,b)=1,则称a,b互质∀a,b∈N,若gcd(a,b)=1,则称a,b互质 对于三个数或更多数的情况,gcd(a, b, c) = 1的情况称为a, b, c互质。把gcd(a, b) = gcd(a, c) = gcd(b, c) = 1称为a b原创 2021-06-14 20:57:24 · 909 阅读 · 0 评论 -
数论之约数
定义约数,又称因数。整数a除以整数b(b≠0) 除得的商正好是整数而没有余数,我们就说a能被b整除,或b能整除a。a称为b的倍数,b称为a的约数。在大学之前,"约数"一词所指的一般只限于正约数。约数和倍数都是二元关系的概念,不能孤立地说某个整数是约数或倍数。一个整数的约数是有限的。同时,它可以在特定情况下成为公约数。(来源百度百科)求约数试除法跟质数提到的一样如果d∣n,那么nd∣n如果d|n,那么\dfrac{n}{d} | n如果d∣n,那么dn∣n约数一定是成对出现的,所以只需要枚举原创 2021-06-14 10:46:08 · 899 阅读 · 0 评论 -
数论之质数
求质数定义:质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。试除法if(n < 2) return false;for(int i = 2; i <= n; i++){ if(n % i == 0){ return false; }}这时候可以引入一个性质:如果d∣n,那么nd∣n如果d|n,那么\dfrac{n}{d} | n如果d∣n,那么dn∣nd∣nd|nd∣n表示d能被n整除那么这条性质就是,n的约数一定是成对出原创 2021-06-11 18:51:35 · 435 阅读 · 0 评论 -
DFS连通性
对于连通性,本质上DFS和BFS实际上都可以解决连通块模型也就是:Flood FIll模型图和树的遍历对于连通块模型,BFS除了可以解决是否连通的问题,也可以解决两个点之间最短距离是多少,但是DFS就只能判断两个点是否连通的问题那这样的话,DFS有什么好处呢?代码短直接用系统栈,不需要手写栈缺点: 当搜索层数很多可能会爆栈解决迷宫问题步骤:从这个点往四个方向出发判断下一个要到的点的合法性,如果可以就继续递归;如果不行就返回上一层继续搜索AcWing 1112.原创 2021-05-23 17:22:00 · 325 阅读 · 0 评论 -
二分图
文章目录什么是二分图染色法二分图最大匹配染色法O(n+m)O(n +m)O(n+m),二分图的判定匈牙利算法O(mn)O(mn)O(mn),实际运行时间一般远小于O(mn)O(mn)O(mn)最大流什么是二分图二分图:如果一个图的 N (N >= 2)个节点,可以分成 A, B两个非空集合,其中A⋂B=∅A\bigcap B = \varnothingA⋂B=∅,并且在同一集合的点之间都没有边相连,那么称这个图为二分图。AB为图的左部和右部染色法首先说明一个性质:一个图是二分图,原创 2021-05-21 13:52:37 · 223 阅读 · 0 评论 -
哈希算法详解
字符串哈希存储结构、字符串哈希方式把庞大的空间或者值域、映射到一个比较小的结构一般数据范围在10510^5105~10610^6106最简单的用法:快速比较两个字符串是不是相等我们都知道,如果比较两个数相等这很简单也很快,但是如果要比较两个字符串是不是相等的话,只能每一个字符挨个比较,那必定会很慢哈希函数就是将一个字符串转换为一个数,那么我们判断两个数就可以了例如我们要判断一串小写字母是不是先等的,那么我们可以把这一串当成一个26进制的数来看看他们是不是相等的;这是第一种做法但是这种做法原创 2021-05-16 13:34:01 · 1238 阅读 · 0 评论 -
KMP字符串模式匹配算法
KMP算法解决什么问题呢?给定一个模式串 S,以及一个模板串 P,所有字符串中只包含大小写英文字母以及阿拉伯数字。模板串 P 在模式串 S 中多次作为子串出现。求出模板串 P 在模式串 S 中所有出现的位置的起始下标。或者是,寻找S串中是不是存在P我们都能很轻松的想到,如果我们要匹配,我们可以把P串的第一位对应S串的每一个字符来进行匹配,如果匹配成功了就匹配P的第二个字符和当前匹配好的S的下一个来再进行匹配;如果中途不能匹配了,就重新从P的头匹配刚才S进行匹配的下一个字符(可能描述不准确,就是原创 2021-05-14 23:51:51 · 216 阅读 · 0 评论 -
trie树 最大异或对
又称字典树(踹树)作用:用来快速的存储和查找字符串集合的数据结构本质根据字符串的每个字符作为节点建树#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>using namespace std;const int N = 1e5 + 10;struct trie{ int son[N][26]; //一般题目都是全小写或者全大写或者全数字或原创 2021-05-14 00:02:57 · 148 阅读 · 1 评论 -
最短路问题初步
分类:单源最短路:求从一个点到其他所有点的最短距离所有边权都是正数——Dijkstra朴素O(n2)O(n^2)O(n2),与边数无关,适用于稠密图堆优化O(mlogn)O(mlogn)O(mlogn),存在负权边Bellman-Ford O(mn)O(mn)O(mn) (不超过k条边)spfa O(m)O(m)O(m),最坏O(nm)O(nm)O(nm)多源最短路:可能会有很多询问,从其中一个点到其他一个点的最短路Floyd算法 O(n3)O(n^3)O(n3)原创 2021-05-05 21:28:59 · 262 阅读 · 4 评论 -
数据结构——堆
堆支持的操作维护一个数据集合插入一个数求这个集合的最值删除最值删除任意一个元素修改任意一个元素堆本质上是一棵完全二叉树,最后一层节点从左到右依次排布的以小根堆为例,每一个点都是小于等于左右儿子的堆的存储用一维数组1为根节点,x节点的左儿子是2x2x2x右儿子是2x+12x+12x+1操作基本操作O(logN)O(logN)O(logN)N是层数// up 上移一个节点void up(int u){ while(u / 2 && h[u / 2]原创 2021-05-04 17:08:05 · 146 阅读 · 0 评论 -
拓扑排序
图搜索遍历你一种应用针对有向图若一个由图中所有点构成的序列 A 满足:对于图中的每条边 (x,y),x 在 A 中都出现在 y 之前,则称 A 是该图的一个拓扑序列。在图论中,由一个有向无环图的顶点组成的序列,当且仅当满足下列条件时,称为该图的一个拓扑排序(英语:Topological sorting)。每个顶点出现且只出现一次;若A在序列中排在B的前面,则在图中不存在从B到A的路径。也可以定义为:拓扑排序是对有向无环图的顶点的一种排序,它使得如果存在一条从顶点A到顶点B的路径,那么在排序中原创 2021-05-03 23:24:08 · 147 阅读 · 0 评论 -
树与图的存储
邻接矩阵:空间复杂度:O(N2)O(N^2)O(N2),常用于存储密集图邻接表:对于每个节点建立一个链表,每个点的链表存储的是这个点能连接到下一个点的信息有向图的邻接表存储就是对于每个点 v 对应一个头节点, 记录在h[v]idx是图里边的编号,和建图的顺序有关,对于某一个点v, 它的所有邻边的编号不一定是连续的。e 数组是edge的缩写,记录了某一条有向边的终点ne数组是next的缩写,记录了邻接表里的同一个点的下一条邻边的idxne[idx]=h[a]; h[a]=idx; 就是把新建.原创 2021-05-03 22:14:16 · 138 阅读 · 0 评论 -
n皇后问题
n−皇后问题是指将 n 个皇后放在 n×n 的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行、同一列或同一斜线上方案一枚举每一种可能的情况,并在所在的行列对角线标记对角线的表示是直线y=x+by=x +by=x+b y=x−by = x - by=x−b推出来的#include <iostream>using namespace std;int n;int col[20];int dg[20];int udg[20];char m[20][20.原创 2021-05-01 23:44:02 · 127 阅读 · 0 评论 -
NOIP2015 跳石头
最近一直在刷二分答案的题,先来总结一下lyd大佬对于二分答案的解释借助二分,我们把求最优解的问题,转化为给定一个值mid,判定是否存在一个可行的方案评分达到mid的问题。对于跳石头这个题来说,我们可能枚举去掉哪几个石头来构成方案的问题很难,但是我们可以通过二分出来它最后跳跃的最短距离可能是多少来进行选择从而本质上二分答案讲问题转化为判定问题最终本题解题思路就是,看看在某一个最短距离的情况下,能不能去掉小于等于m块石头的方案如果某个距离答案满足了去掉的小于等于m的方案个数,那么我就看看比它小原创 2021-04-28 18:36:07 · 269 阅读 · 0 评论 -
最大字段和
给出一个长度为 n 的序列 a,选出其中连续且非空的一段使得这段和最大。暴力解法:int n;int a[200000 + 10];int main(){ cin >> n; for(int i = 1; i <= n; i++){ cin >> a[i]; } int ans = -1; for(int i = 1; i <= n; i++){ for(int j = i; j <= n; j++){ int .原创 2021-04-28 17:42:46 · 120 阅读 · 0 评论 -
单调栈与单调队列
单调栈常见模型:给定一个序列,求一下每一个数的左边离他最近的且比它小的数在什么地方。存在逆序的关系,答案一定是右边的那个#include <iostream>using namespace std;int n;int stk[100000 + 10];int tt;int main(){ cin >> n; for(int i = 1; i <= n; i++){ int x; cin >> x; while(tt &&原创 2021-04-28 14:12:17 · 124 阅读 · 0 评论 -
链表与邻接表
单链表来实现邻接表,邻接表本质上是n个链表邻接表的应用:存储图,树双链表:优化部分题目链表的每个节点存储两个值:当前链表节点的val (e[])和下一个节点的地址ne[]/* head 表示头节点的下标e[i] 表示节点i的值ne[i] 表示节点i的next指针是多少idx 当前最大已经用到了哪个点,目的是为了方便后续添加新的链表*/int head;int e[N];int ne[N];int idx;void init(){ head = -1; // 表示空集 i原创 2021-04-27 00:23:28 · 457 阅读 · 0 评论 -
背包问题求具体方案
01背包状态表示与01背包相同集合分析与01背包完全相同选择方案的判断,就是看每次方案的选择是哪一个如果我们此时状态的计算f[i, j]的值是不选第i个物品的价值,即此时最大的价值就是f[i - 1, j],那么我们此时的方案就是不选第i个物品同理,如果从右边取最大值,我们的答案就是选第i个即我们判断这个值是等于哪一个来判断第i个物品选还是不选了这样我们就可以从后往前推一遍来判断某个物品选还是不选了为什么要从后往前推呢?只有从后往前推才能逐一的判断从最优解的答案开始往前推而答案还要保证字原创 2021-04-23 23:59:42 · 165 阅读 · 0 评论 -
离散化
这里是整数、有序离散化含义:在一个比较大的值域范围内(10910^9109),但是个数比较少(10510^5105)(整个的值域跨度很大,但他非常的稀疏)有些题目,我们需要以这个值域中的数来作为下标来做我们的解决方法就是把这些数,映射到从0开始到n-1的自然数里可能有的问题:a中可能有重复元素——>需要去重如何快速的算出x里的值在原数组a中映射的值是多少,即离散化后的值——>a是有序的,二分找第x大的vector<int> alls; // 存储所有待离散化的值s原创 2021-04-21 10:24:36 · 183 阅读 · 0 评论 -
背包问题概述
01背包:每件物品只能选一个,背包体积为V,每个物品的体积和价值分别是 vi,Wiv_{i},W_{i}vi,Wi完全背包:每件物品能取无限个多重背包:每个物品个数不一样,每个物品最多有xi个分组背包:物品有n组,每组物品有若干个(组里的物品的属性可能不相同),每组最多只能选一个物品对于闫氏dp法的基本流程:先以最朴素方式考虑对于一个dp问题分成两种情况考虑:状态表示和状态计算对于状态表示,再从两个角度考虑:它所表示的集合是什么(这个集合的定义是什么)这个集合所包含的属性是什么.原创 2021-04-14 12:54:28 · 413 阅读 · 0 评论 -
Flood Fill算法总结
最近一直跟着y总在刷蓝桥杯的课,借此我来对里面设计到的Flood Fill算法做一个我目前接触到的所有的flood fill算法的总结总首先,这本质上是一个搜索算法。他的作用是对一个图(目前我用到的都是二维数组的图,不是图论的图)的所有的连通块进行操作它是可以从其中一个点出发,扩展与这个点相邻的所有点也就是说,给定连通块的所有的点,都可以把这个连通块上所有的点全部搜到那么我对每一步进行讲解,并对每一个例题给出代码,这里只讲解bfs的写法int bfs(PII start){ queue<原创 2021-04-07 23:45:17 · 1378 阅读 · 0 评论 -
AC1113红与黑(搜索算法)
y总说这叫洪水灌溉算法(flood fill算法)具体的实现就是通过两种搜索算法来类似的在方格上模拟类似洪水水流似的来覆盖方块题目链接就是普普通通的搜索吧注意这题有个坑就是行宽不是按顺序给的// bfs#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <cmath>#include <map>#原创 2021-04-05 18:15:41 · 286 阅读 · 0 评论 -
差分
差分算法一维差分首先我们定义a是原数组,b是差分数组b数组的含义表示为a[i]=b[1]+b[2]+⋯+b[i]a[i] = b[1] + b[2] + \cdots+b[i]a[i]=b[1]+b[2]+⋯+b[i]核心操作是在a数组的某个区间(L~R)上加上cb[L]+=cb[R+1]−=cb[L] += c\\b[R + 1] -= cb[L]+=cb[R+1]−=c那么根据定义:a数组是b数组的前缀和,在b[L]的地方加上了c,对前面的数都不会有影响,但是后面所有的a数组都原创 2021-04-05 14:55:18 · 165 阅读 · 0 评论 -
初识线段树
操作一:单点修改(回溯修改)O(logn)O(log_n)O(logn)区间查询O(logn)O(log_n)O(logn),拆成若干了小区间思想:得到答案,向上合并第一步:建树int n; //我们数组一共有n个数#define root 1,n,1#define lson l,m,rt<<1 //这个线段树把左区间分为l到m,右区间是m+1到r#define rson m+1,r,rt<<1|1void update(int rt){ z[r原创 2021-03-24 23:05:03 · 109 阅读 · 0 评论 -
并查集
支持的操作:询问某个元素属于哪个集合(query)合并两个集合(merage)合并两个集合连一条有向边两个元素是否属于一个元素,就是从两个点开始走,看这个两个点最终走向的是不是同一个集合来判断是否是一个修改把某个点的指向改一下CODE:int f[N]; //f[i]表示从i走出去这个点会指向哪个点void init(int n){ for(int i = 1; i <= n; i++) f[i] = i;}int query(int p){原创 2021-03-24 20:09:43 · 105 阅读 · 0 评论 -
由楼兰图腾对树状数组求逆序对的总结
楼兰图腾这个题,就是求两个答案,一个是一个元素的两边,左边比它大的乘以右边比它大的(乘法原理);同样再求一次两边比它小的相乘的个数而由这题引发的树状数组求逆序对的个数,最重要的就是求解过程中,要从后往前循环,这样,因为我们是从后往前循环的,统计当前的q[i]有多少比它小的,就能满足,i<ji < ji<j 且 a[i]>a[j]a[i] > a[j]a[i]>a[j] ,这样就通过树状数组,得到在当前这个数出现的时候,他前面已经枚举过的数(也就是这个数的后面,这里可能说原创 2021-03-21 15:46:06 · 127 阅读 · 0 评论
分享