
树状数组
ssl_fuyang
ヾ(◍°∇°◍)ノ゙
展开
-
区间修改区间查询【树状数组】
>Linkybtoj区间修改区间查询>解题思路很经典的线段树模板,其实也可以用树状数组做考虑差分,ti=ai−ai−1t_i=a_i-a_{i-1}ti=ai−ai−1,那显然 ai=∑j=1itja_i=\sum_{j=1}^it_jai=∑j=1itj把查询的区间 [l,r][l,r][l,r] 转换成查询 [1,l][1,l][1,l] 和 [1,r][1,r][1,r]suml=a1+a2+...+al=(t1)+(t1+t2)+...+(t1+t2+...+t原创 2021-11-19 17:25:12 · 182 阅读 · 0 评论 -
たのしい家庭菜園【树状数组】【离散化】
>Link[THOJ]交换swap>Description>解题思路枚举每一个数,判断放在左边还是右边放在左/右边,这个数就要“跨过”它原本左/右边比它大的数,我们就加上它左/右边比它大的数的个数我们可以手玩一下证明,这样做是最优的。如果一个数AAA要放到左边去,原本它左边有比它小的数BBB也要放在左边,乍一看我们好像忽略了BBB与AAA交换的次数,但其实BBB肯定是在AAA之前就交换过去了,不会与AAA相遇用树状数组处理就行了>代码#include &l原创 2021-11-11 21:38:32 · 150 阅读 · 0 评论 -
No Time to Dry【ST表】【树状数组】
>Linkluogu P7416jzoj7232>Description>解题思路赛时打的暴力单调栈20分QAQ观察一个区间[l,r][l,r][l,r],最多的步骤为r−l+1r-l+1r−l+1,如果有cntcntcnt步可以不做,最少的步骤就为r−l+1−cntr-l+1-cntr−l+1−cnt怎么样的步数可以合并?单调栈的思路,如果当前的数字aia_iai,与上一次出现的位置之间,没有小于aia_iai的数字,那当前的位置的步骤就可以与上一次出现的位置原创 2021-08-17 07:53:23 · 147 阅读 · 0 评论 -
United Cows of Farmer John【树状数组】
>Linkluogu P7527jzoj7220>Description>解题思路选一个区间[l,r][l,r][l,r],是的lll上的数字和rrr上的数字在区间只出现过一次我们O(n)O(n)O(n)枚举右端点的位置,维护一个lastilast_ilasti表示数字iii目前最后一次出现的位置,那我们可以知道左端点一定在(lastai,i)(last_{a_i},i)(lastai,i)中(先不更新第iii位),我们只用知道(lastai,i)(last_{a原创 2021-08-15 19:03:55 · 164 阅读 · 0 评论 -
严格上升子序列数【DP】【树状数组】【离散化】
>Linkybtoj严格上升子序列数>Description有TTT组数据,给出一个长度为NNN的序列,问每组数据的序列中,长度为mmm的上升子序列有多少个,答案对109+710^9+7109+7取模>解题思路首先必须要说一下最近做题的状态⬇,太粗心了????????,每道题必先爆零,不是没开longlong就是没模数,所以说做题得细心点啊……回归正题,这道题有点麻烦,上升子序列的长度已经规定好了,我先想到的也是DP,用fi,jf_{i,j}fi,j表示以第iii个数结原创 2021-07-05 20:51:24 · 493 阅读 · 1 评论 -
逆序对【树状数组】【离散化】
>Linkybtoj逆序对luogu P1908>解题思路树状数组的模板题…但是因为aia_iai太大,数组空间不够,所以要离散化一下然后 一!定!要!开!longlong!TT>代码#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#define N 500010#define LL long longusin原创 2021-07-05 15:30:04 · 177 阅读 · 0 评论 -
单点修改区间查询【树状数组】
>Linkybtoj单点修改区间查询luogu P3374>解题思路树状数组板子(要加long long)>代码#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#define LL long long#define N 10000010using namespace std;int n, q;LL t[N];原创 2021-07-05 15:13:38 · 95 阅读 · 0 评论 -
经典LIS【树状数组】【离散化】
>Linkybtoj经典LIS>解题思路经典的求最长不下降子序列模板题#1 O(n2)O(n^2)O(n2) 直接DP解决#2 O(nlogn)O(nlogn)O(nlogn) 离散化+树状数组,以每个元素的值建树>代码#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#define N 500010using nam原创 2021-05-14 09:46:05 · 210 阅读 · 0 评论 -
CF261D Maxim and Increasing Subsequence【树状数组】【DP】
>Description给你一个长度为n的B数组,A表示B数组复制t遍后首尾相连后的数组,求A的最长上升子序列 有k组询问 maxb表示B数组中最大的数(1<=k<=10; 1<=n,maxb<=10^5; 1<=t<=10^9; n * maxb<=2*(10^7))>解题思路设sumsumsum为B数组中不同数字的个数可以发现:当ttt大于等于sumsumsum时,ans一定为sum,因为我们可以在每一个A数组中的B数组中只选择一个不同数原创 2020-08-18 18:02:51 · 148 阅读 · 0 评论 -
简单计算题【离散化】【树状数组】
>Description>Input>Output>Sample Input41 4 3 2>Sample Output3>解题思路首先我们要知道一个树状数组与逆序对的东西(所以为了防爆,得用离散化把S序列离散一下在加进树状数组)然后我们把符合(a,b)的方案数p,符合(c,d)的方案数q求出来(树状数组求逆序对,具体得理解树状数组太多了不想打了 ),ans=pq,接着处理a≠b≠c≠d的情况,因为a已经小于b,c已经小于d,所以就只用原创 2020-08-13 22:03:21 · 170 阅读 · 0 评论