随笔分类 - 树状数组
摘要:题目链接 题链 题解 区间众数的个数 \(>\) 区间长度一半 称这个区间有主元素,主元素就是这个众数; 题意:求数组中有多少个区间有主元素; 考虑一个子问题:每一种数作为主元素的贡献; 例如给定数组 \(p = [3,2,1,3,3,2]\),并考虑 \(3\) 作为主元素的贡献; 我们可以将是数
阅读全文
摘要:题链 这里用树状数组写法; 考虑求[1,x]的区间和 \(sum_x\),于是将原数组差分后,相当于求一个二阶前缀和; 设原数组为 \(a_i\), 差分后的数组为 \(b_i = a_i - a_{i-1}\); 于是 \(a_i = \sum_{j=1}^{i}{b_j}\); 那么[1,x]的
阅读全文
摘要:题链 首先点分治; 由于求解的是小于等于k的个数,于是开一个树状数组维护前缀和即可; #include<bits/stdc++.h> using namespace std; #define LL long long #define MAXN 20009 #define MS 40009 int n
阅读全文
摘要:题链 --解法一 跑一边dfs序,按照权值大小对n个点从大到小排好遍历,对于第i个点只要求它子树的和就行; #include <bits/stdc++.h> using namespace std; #define ls rt<<1 #define rs rt<<1|1 #define LL lon
阅读全文
摘要:题链 题意:判断序列能否选择c个数字同时-1并执行s次,操作单点修改; 对于序列中>=s的数字,相当于那些数字就等于s,毕竟执行s次也不会把这些数字删成0; 结论就是八那些超过s的数字看作s,如果序列的总和>=c*s的话,就是可行的,否则不可行; 把每个数想象成不同颜色的楼房,比如 7 9 3 2
阅读全文
摘要:题链 可将询问按L从小到大排序,每次将序列中花朵第二次出现的位置置为1,用树状数组维护; --树状数组 //#include <bits/stdc++.h> #include <iostream> #include <algorithm> #include <ctime> #include <cma
阅读全文
摘要:#-- 原题解 题链 #-- 对于化简后的式子的理解 p[i] 是下标 i 之前有多少个与当前询问字母相同的字母; 将 ai-bp[i] 记为式子① ,将 ci-dp[i] 记为式子②; 为这两个式子构建两颗权值树状数组一二; 对于每一个新加入的 p[i],用式子②计算权值val2插入到第二颗树状数
阅读全文
摘要:题链 对于每一个a[i]可以记录它上一次出现的位置; 1.可以用树状数组解(离线):对询问排序(询问的r从小到大),右指针移动则add(R,1),然后对a[R]上一次出现的位置add(pos,-1),对于一个询问则是query(r)-query(l-1); 2.可以主席树记录原数组下标方式解(在线)
阅读全文
摘要:题链 询问区间种类不能直接通过类似 get_sum(r)-get_sum(l-1) 的方式去得出答案 如何使得上述方式可以求解成为关键,可以将m个询问按照右区间r从小到大排列,不试图将所有数据(题给的一串贝壳数组)一起建立树状数组,通过一个个将数组中的元素加入树状数组时,对于该种类上一次出现的位置l
阅读全文
摘要:题链 若要将一个排列转换成另一个排列,一次只能交换相邻两个元素,例如将 a = {4, 3, 1, 2} 变成 b = {1, 3, 2, 4},最少需要交换 a或b 几步; 新建 pa[a[i]] = i 记录排名a[i]的位置,pb[b[i]] = i 记录排名b[i]的位置,令p[pa[i]]
阅读全文