树状数组
穷源溯流
路很长,尽管走便是。
展开
-
洛谷 P2345 [USACO04OPEN]MooFest G(树状数组)
const int N=2e4+5; int n,m,_; int i,j,k; //int a[N]; struct Node { int pos; int val; bool operator<(Node o){ return val<o.val; } void read(){ sdd(val,pos); } }a[N]; ...原创 2021-05-11 19:00:47 · 408 阅读 · 0 评论 -
洛谷 P5149 会议座位(树状数组+Trie)
题目是一道求逆序对的题目,但是我们先要将每一个名字转化为数字再进行计算 求逆序对的个数用树状数组或归并即可 题目有个坑点,名字包含大小写字母,所以字典树需要开大一点 #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #define ss(a) scanf("%s",a) #define sd(a) scanf("...原创 2021-02-04 23:32:19 · 217 阅读 · 0 评论 -
洛谷 P4113 [HEOI2012]采花(树状数组)
又是一道莫队的模板题 看到熟悉的 2e6 的数据量,应该也知道莫队跑步过去了,题目好不容易猜出了结论,但是却置疑他的准确 这个题目和HH的项链这个题比较像 同样此题也要采用树状数组来优化 对于一个区间内出现的相同的颜色,我们只计算倒数第二个所做的贡献,算法的准确性: 对于一个区间 [b.......a......a...c...a...d..A...e..a...f] (应该是不分大小写的)其中只有 A 对于答案有贡献, 对于询问 [b,e] 或者 [c,e] 答案都只有 A...原创 2021-01-24 15:08:01 · 162 阅读 · 0 评论 -
洛谷 P1972 [SDOI2009]HH的项链(离线树状数组)
其实题目就是一道莫队模板题,套模板即可 话说明明是莫队的模板题为什么要用树状数组解啊 数据范围过大 ,用莫队的话 O(n^1.5) 达到 1e9 的复杂度,所以需要改进,只能将优化为 logn 不妨将区间[……a …… a……a……a……] 中最后一个 a 作为答案的贡献,这样讨论区间内的种类数就可以保证正确性 每次出现 a 的时候都要更新 a 的位置,利用桶排思想在对应位置更新 最后统计位置的区间和即可 const int N=1e6+5; int i,j,k;...原创 2020-12-13 22:29:16 · 195 阅读 · 0 评论 -
洛谷 P3353 在你窗外闪耀的星星(树状数组)
利用数组在 x 处做个映射,为 x 点处的亮度之和,这样利用树状数组在区间查询的时候要注意一下端点的情况 从位置 1 开始,一直到 1e5,寻找最大的区间和,复杂度为 O(1e5logn),不开 o2 过不去,但是修改一下循环条件即可 const int N=1e5+5; int i,j,k; int n,m; int a[N]; int c[N]; void add(int x,int w) { for(;x<=n;x+=lowbit...原创 2020-11-29 11:29:51 · 370 阅读 · 0 评论 -
洛谷 P2184 贪婪大陆(树状数组+差分)
题意不太明确,炸弹并不会覆盖区间 根据差分的思维, 在 [l,r] 区间内添加一枚炸弹,diff[l]++,diff[r+1]-- 查询区间内有多少颗炸弹时,需要遍历区间 [l,r] ,如果利用树状数组维护的话,复杂度会小很多 const int N=1e5+5; int i,j,k; int n,m; int a[N]; int c[N][2]; void add(int x,int k) { for(;x<=n;x+=lowbit...原创 2020-11-29 10:48:45 · 284 阅读 · 0 评论 -
洛谷 P2357 守墓人(树状数组)
树状数组区间更新,区间查询的入门好题 const int N=2e5+5; int i,j,k; int n,m,t; ll a[N]; ll c[N][2]; ll sum[N]; void add(int x,int y,int k) { for(;x<=n;x+=lowbit(x)) c[x][k]+=y; } ll ask(int x,int k) { ll ans=0; for(;x;x-...原创 2020-11-28 10:53:29 · 410 阅读 · 0 评论 -
1537:校门外的树
const int N=2e5+5; int n,m,t; int i,j,k; int L[N]; int R[N]; void update(int pos,int val,int *c) { for(int i=pos;i<=N;i+=lowbit(i)){ c[i]+=val; } } int sum(int pos,int *c) { int ans=0; for(int i=pos;i;i-=lo...原创 2020-09-17 14:39:49 · 369 阅读 · 0 评论 -
1539:简单题
const int N=2e5+5; int n,m,t; int i,j,k; int L[N]; int R[N]; void update(int pos,int val,int *c) { for(int i=pos;i<=N;i+=lowbit(i)){ c[i]+=val; } } int sum(int pos,int *c) { int ans=0; for(int i=pos;i;i-=lo...原创 2020-09-17 14:32:12 · 347 阅读 · 0 评论 -
1538:清点人数
const int N=2e5+5; int n,m,t; int i,j,k; int c[N]; void update(int pos,int val) { for(int i=pos;i<=N;i+=lowbit(i)){ c[i]+=val; } } int sum(int pos) { int ans=0; for(int i=pos;i;i-=lowbit(i)){ ans+=c[i];...原创 2020-09-17 14:08:42 · 569 阅读 · 0 评论 -
1536:数星星 Stars
const int N=2e5+5; int n,m,t; int i,j,k; int c[N]; Pair p[N]; int ans[N]; void update(int pos,int val) { for(int i=pos;i<=N;i+=lowbit(i)){ c[i]+=val; } } int sum(int pos) { int ans=0; for(int i=pos;i...原创 2020-09-17 13:59:56 · 493 阅读 · 0 评论 -
D. Nested Segments(树状数组+离散化)
给出 n 个区间,求每个区间包含多少个区间 对于所有区间,我们先按 l 的值降序排列 这样对于 l[i] 来说,下一个 l[i+1] <=l[i],这样对于第 i+1 个区间有可能包含第 i 个区间的条件是 r[i+1]>=r[i] 同时也为我们提供了当 l[i+1]=l[i] 时的排序方法 按上述排完序之后,遍历区间,利用桶排标记 r[i] 在数轴上的点 每次求出数轴上 1~r[i]之间有几个点被标记即可 但是注意到题目中的 r 的值过大 所以需要对 r 进行离散...原创 2020-08-01 15:55:33 · 310 阅读 · 0 评论 -
C. Fountains(最大值树状数组)
有 n 个泉水,c 枚金币,d 枚钻石,每个泉水可以带来 b 点欢乐值,但要消耗 p 枚金币或钻石,只能买两座泉水,问最大的快乐值 这个题明显贪心啊 如果两种泉水各买一座还好,但是有可能一种泉水买两坐,剩下的一种不买,所以利用树状数组求区间最大值 const int N=2e5+5; int n,m,t; int i,j,k; int c[N],d[N]; int get_max(int x,int *aim)//1~x 的最大值 { int...原创 2020-07-31 14:06:17 · 292 阅读 · 0 评论 -
P1198 [JSOI2008]最大数(树状数组反向建树)
const int N=2e5+5; int n,m,t; int i,j,k; ll c[N]; ll query(int x) { ll ans=1<<31; while(x){ ans=max(ans,c[x]); x-=lowbit(x); } return ans; } void add(int x,ll val) { val%=m; while(x<=n)...原创 2020-07-30 23:08:04 · 225 阅读 · 0 评论 -
P5367 【模板】康托展开(树状数组)
关于康托展开,假设有一个长度为 n 的序列{a1,a2,a3,……an},比它字典序小的排列有 种,其中 表示在序列中 ai 后面有几个比 ai 小的数 例如: 之后要解决的就是快速求 利用树状数组快速求出前缀和的特点,还是序列{2,4,1,5,3} 首先树状数组置为 1,相当于未访问过,当元素被访问时,置为 0 当 2 被访问时,求前缀和为 1(不包括自己),随后 2 被置为 0 当 4 被访问时,求前缀和为 2(不包括自己和 2 ),随后 4 被置为 0 思路来自:洛谷...原创 2020-07-28 10:17:45 · 373 阅读 · 0 评论 -
P4392 [BOI2007]Sound 静音问题(树状数组+区间最值)
const int N=1e6+5; int n,m,t; int i,j,k; //Pair c[N]; //fr->max,sc->min int a[N]; vector<int> ans; struct Tree { int fr=-inf; int sc=inf; }c[N]; int lowbit(int x){ return x&(-x); } void...原创 2020-07-27 22:25:19 · 217 阅读 · 0 评论 -
1535:数列操作
const int N=1e5+5; int n,m,t; int i,j,k; int c[N]; void update(int pos,int val) { while(pos<=n){ c[pos]+=val; pos+=lowbit(pos); } } int get_sum(int x)//第 1 个数到第 x 个数 { int ans=0; while(x){ ans+=...原创 2020-07-26 21:55:19 · 392 阅读 · 0 评论