题目链接:https://www.luogu.com.cn/problem/P2184
题目大意,区间上进行两种操作。
操作一:在l-r之间埋上一种地雷。
操作二:询问在l-r之间有多少种地雷。
题解:
线段树或者树状数组都可以。
对于询问l-r之间有多少地雷,可以理解为首部在r之前的线段段数减去尾部在(r-1)之前的线段段数,所以对于埋地雷的操作l-r,可以理解为在两个线段树上的某个位置加一,询问相当于是求每个线段树的前若干个位置的总和是多少,然后两个线段树求出来的答案再进行相减操作就是答案,对于这种单点修改、区间询问的类型,用树状数组会非常方便。
注:当然树状数组也可以处理区间修改,单点询问的题目,转化成差分即可。
#include<bits/stdc++.h>
int n,op,x,y,m;
int a[110000],b[110000];
int lowbit(int p){return p&(-p);}
void add1(int p){
while(p<=n){
a[p]++;
p+=lowbit(p);
}
}
void add2(int p){
while(p<=n){
b[p]++;
p+=lowbit(p);
}
}
int query1(int p){
int sum=0;
while(p){
sum+=a[p];
p-=lowbit(p);
}
return sum;
}
int query2(int p){
int sum=0;
while(p){
sum+=b[p];
p-=lowbit(p);
}
return sum;
}
int main(){
scanf("%d%d",&n,&m);n++;
while(m--){
scanf("%d%d%d",&op,&x,&y);
x++;y++;
if(op==1)add1(x),add2(y);
if(op==2)printf("%d\n",query1(y)-query2(x-1));
}
return 0;
}