线段树/树状数组问题 | 问题集合

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线段树/树状数组问题 | 问题集合相关的知识,希望对你有一定的参考价值。

写在前面

 

线段树代码实在冗长,于是乎能用树状数组直接搞的就懒得打线段树了(:溜

 


 

 1.P2620[QZYZ] 校门外的树

描述 Description

校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的……
如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两个操作:
K=1,读入l,r表示在l~r之间种上的一种树
K=2,读入l,r表示询问l~r之间能见到多少种树
(l,r>0)

输入格式 InputFormat

第一行n,m表示道路总长为n,共有m个操作
接下来m行为m个操作

输出格式 OutputFormat

对于每个k=2输出一个答案

样例输入 SampleInput

4

3
5
4
5

样例输出 SampleOutput

1 

2 

技术分享
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 #include <cstring>
 5 #define lowbit(x) x&(-x)
 6 
 7 using namespace std;
 8 
 9 int l[1001] , r[1001] , n , m;
10  
11 int read()
12 {
13     int x = 0;
14     char c = getchar();
15     while(c < ‘0‘ || c > ‘9‘) c = getchar();
16     while(c >= ‘0‘ && c <= ‘9‘) x = x*10 + c-‘0‘ , c = getchar();
17     return x;
18 }
19 
20 void add(int arr[],int x)
21 {
22     while (x<=n)
23     {
24         arr[x]++;
25         x+=lowbit(x);
26     }
27     return;
28 }
29  
30 int query(int arr[],int x)
31 {
32     int ans=0;
33     while (x>0)
34     {
35         ans+=arr[x];
36         x-=lowbit(x);
37     }
38     return ans;
39 }
40 
41 int main()
42 {
43     cin >> n >> m;
44     while(m--){
45         int x , y , z;
46         z = read(),x = read(),y = read();
47         if (z == 1)
48             add(l , x),add(r , y);
49         else cout << query(l , y) - query(r , x-1) << endl;
50     } 
51     return 0;
52 }
校门外的树

 






以上是关于线段树/树状数组问题 | 问题集合的主要内容,如果未能解决你的问题,请参考以下文章

ACM算法目录

ACM算法目录

算法分类合集

树状数组和线段树的那些事

算法分类合集(转)

算法分类合集(转)