树状数组
小胡同的诗
千里之行,始于足下
展开
-
LeetCode315 计算右侧小于当前元素的个数(分治求逆序数)
题目链接:leetcode315给你一个数组,让你求每个位置的数后面比它小的数的数量。也就是以每个数字为头的逆序对的数量。解题思路树状数组、线段树先离散化一下,然后逆序统计每个位置前比该数字小的数。分治先离散化,再利用归并排序把数组逆序,并求后面的区间对前面区间的贡献。代码分治class Solution {public: vector<int> countSmaller(vector<int>& nums) { int n =原创 2020-10-31 17:51:25 · 217 阅读 · 1 评论 -
LeetCode493翻转对(树状数组+离散化)
题目链接:Leetcode493思路:同求逆序数一样的更新查询,关键在于离散化部分,我们要得到原序列与2倍序列所对应的位置,并且为了最后能够常数时间查到原序列对应位置的2倍序列的数值的位置,用个哈希函数id%nid\%nid%n表示同位置的对应的位置,设一个rnk1表示原序列位置,rnk2表示2倍序列的位置,题就解决了。关于离散化那个用二分处理的可能不好操作,用结构体排序会快点Code:c...原创 2019-08-30 08:30:48 · 429 阅读 · 1 评论 -
查询区间恰好有2个的数字种类数
思路:离线做法:首先离散化数字arr,并按右端点处理询问,原理和处理区间种类数一样然后把1~n的相同的数字预处理一下,让每个相同的数字可以索引到它后面那个位置,也称为这个节点的后继,实际上就是按类构造静态链表之后预处理每个链表首部有后继的节点在表头位置+1然后根据树状数组处理1~n的区间,每当一个节点有后继时它的位置-1,后继+1,使得该区间的总数不变,并且靠后的区间也能够共享到这个成果...原创 2019-07-12 10:43:05 · 365 阅读 · 0 评论 -
蓝桥杯--小朋友排队(树状数组求逆序数或归并排序)
&amp;nbsp; 历届试题 小朋友排队 &amp;nbsp;时间限制:1.0s &amp;nbsp; 内存限制:256.0MB &amp;nbsp; &amp;nbsp; function clickHelp(hid){var vobj = document.getElementById(“help”+hid);if (vobj.style.display!=“block”)原创 2019-02-25 12:34:15 · 466 阅读 · 0 评论 -
HDU3333Turing Tree(思维+树状数组+离线+Map)
题目链接:hdu3333题目大意:给一段n长度的数字序列,以及q长度的区间询问,问区间不同数字大小之和。解题思路:跟区间数种类这题类似只不过种类数改成不同种类数字之和。树状数组改成维护不同种类数字之和。注意数字之和会爆int,C数组设置成long longAC代码:#include <cstdio>#include <cstring>#include <...原创 2019-02-19 18:03:23 · 420 阅读 · 0 评论 -
Codeforces Round #450 (Div. 2)(思维+树状数组)
题意:若数组中一个数前的所有数都比这个数小,那么定义它为一个record。若去掉某一个元素使剩下的数组中record最多,求这个元素 分析:对每个元素,考虑去掉它的情况。若第i个元素前有i-1个小于它的元素,则去掉该元素后这个数组前i个元素的record总数-1.若第i个元素前有i-2个小于它的元素,那么去掉前i个元素中大于第i个元素的那个元素后,前i个元素的record总数+1.若第i个...转载 2019-02-19 16:55:13 · 102 阅读 · 1 评论 -
POJ3465A Simple Problem with Integers(树状数组--区间查询 区间修改)
题目链接:POJ3468题目大意:给你一段长度为n得数字序列,并且有q次操作,这些操作可能是查询[l,r]的数字和或者是修改[l,r]之间的数字。每次做出相应操作,查询则输出结果。解题思路:关于数字序列区间问题,可以用线段树,但要加个延迟标记(之后更新这种做法)。这里通过树状数组的性质,并且预处理树状数组(差分操作),使其能够区间更新。关于区间修改的树状数组这里树状数组我们用c[max...原创 2019-02-24 17:13:11 · 212 阅读 · 0 评论 -
FJUT3097区间数种类(思维+树状数组+离线)
题目链接:fjut3097题目大意:RT,大致就是给你n长度的数字序列,以及q组含左右端点的区间查询,问区间内的数字种类解题思路:我们利用C数组表示从1~i的区间的数字的种类数,这样就可以通过getsum(right) - getsum(left-1)求得区间[left,right]的情况。但问题就转化成如何维护这个C数组,这里我们发现,但凡某个数字在k位置之前还发现有一个跟它一样(假设这个位...原创 2019-02-19 12:46:33 · 470 阅读 · 0 评论 -
POJ2299Ultra-QuickSort(树状数组+离散化)
题目链接:POJ2299题目大意:给你n个数字,问这段序列类似于冒泡排序后至少需要几次交换。解题思路:实际上就是求数列的逆序数,树状数组可以解决,由于数据规模大到达long long的规模,离散化一下。注意开的val要为long long!AC代码:#include &lt;cstdio&gt;#include &lt;cstring&gt;#include &lt;cstdlib&.原创 2019-02-17 23:19:00 · 140 阅读 · 0 评论 -
HDU1541、POJ2352<Start>(树状数组入门题)
题目链接:POJ2352,HDU1541题目大意:给n个星星的坐标,输入保证纵坐标y按非递减序输入,并且不会两个星星位置重复。如果某个星星左下角(包含边界)共包含k个星星,则成该星星的等级为k。分别输出0~n-1等级的星星数量解题思路:虽说这是道树状数组的入门题,但仍没反应过来。个人理解是:c数组维护的是<=idx的前缀和,每次将横坐标为x加入的时候可以先查询一下目前小于等于x的个数,这...原创 2019-02-16 12:17:32 · 171 阅读 · 0 评论 -
NowCoder逆序数(离散化+树状数组)
题目链接:逆序数解题思路:逆序数模板题,将数值离散化后把求值的逆序数转化成求其rank的逆序数。利用树状数组提升标记数组的效率。注意i - get_sum(rnk[i])表示在长度为i,或者说第i个数,之前排名比他大数量。AC代码:#include <cstdio>#include <cstring>#include <cstdlib>#incl...原创 2019-02-15 17:05:41 · 156 阅读 · 0 评论 -
逆序数介绍以及算法实现
前言线性代数中对于一段数字序列的排列情况有这样一个定义:在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。一个排列中所有逆序总数叫做这个排列的逆序数。也就是说,对于n个不同的元素,先规定各元素之间有一个标准次序(例如n个 不同的自然数,可规定从小到大为标准次序),于是在这n个元素的任一排列中,当某两个元素...原创 2019-02-15 16:07:06 · 4505 阅读 · 0 评论 -
HDU1166敌兵布阵(树状数组)
题目链接:hdu1166题目大意:RT,多次查询与更新。解题思路:单点更新,区间查询,利用树状数组二分的特性将复杂度均摊到O(logn),注意cin会卡超时,用scanf稳过。AC代码:#include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>#incl...原创 2019-02-14 17:01:52 · 202 阅读 · 0 评论