[luoguP2184] 贪婪大陆(树状数组)

本文介绍了一种使用两个树状数组解决特定区间查询问题的方法。通过维护区间两端点的数量,能够快速计算出指定区间的有效配对数目。具体实现包括了如何增删元素以及查询区间的有效配对数量。

传送门

 

用两个树状数组,cr 维护 1....x 中 r 的数量

         cl 维护 1....x 中 l 的数量

求答案的时候只需要求 y 前面 被作为左端点 的个数 - x 前面 被作为右端点的个数

 

——代码

 1 #include <cstdio>
 2 
 3 using namespace std;
 4 
 5 const int MAXN = 1000001;
 6 int n, m;
 7 int cl[MAXN], cr[MAXN];
 8 
 9 inline void add1(int x) { for(; x <= n; x += x & -x) cl[x]++; }
10 inline void add2(int x) { for(; x <= n; x += x & -x) cr[x]++; }
11 inline int query1(int x) { int ans = 0; for(; x; x -= x & -x) ans += cl[x]; return ans; }
12 inline int query2(int x) { int ans = 0; for(; x; x -= x & -x) ans += cr[x]; return ans; }
13 
14 int main()
15 {
16     int i, j, x, y, z;
17     scanf("%d %d", &n, &m);
18     for(i = 1; i <= m; i++)
19     {
20         scanf("%d %d %d", &z, &x, &y);
21         if(z == 1)
22         {
23             add1(x);
24             add2(y);
25         }
26         else printf("%d\n", query1(y) - query2(x - 1));
27     }
28     return 0;
29 }
View Code

 

转载于:https://www.cnblogs.com/zhenghaotian/p/6826864.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值