一、题目:
二、思路:
左右括号法。
对于每次操作
[
a
,
b
]
[a,b]
[a,b],将位于
a
a
a的左括号个数加一,位于
b
b
b的右括号个数加一。
对于每次查询
[
a
,
b
]
[a,b]
[a,b],定义
X
X
X等于
1
1
1到
b
b
b的左括号个数,
Y
Y
Y等于
1
1
1到
a
−
1
a-1
a−1的右括号个数,答案即为
X
−
Y
X-Y
X−Y。
当然可以用树状数组,但此题数据巨水,暴力枚举就过去了。
三、代码:
#include<iostream>
#include<cstdio>
using namespace std;
template<class TT>
inline void read(TT &num){
TT x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
num=f*x;
}
const int maxn=50005;
int n,m,L[maxn],R[maxn];
int main(){
read(n);read(m);
for(register int i=1;i<=m;i++){
int opt,l,r;read(opt);read(l);read(r);
if(opt==1){
L[l]++;R[r]++;
}
else {
int ans=0;
for(register int i=1;i<=r;i++){
ans+=L[i];
}
for(register int i=1;i<=l-1;i++){
ans-=R[i];
}
printf("%d\n",ans);
}
}
return 0;
}