洛谷 P2184 贪婪大陆

题面

 

    又是一类比较套路的题呢?

    假如我们的地雷都表示成 [l[i],r[i]] ,要求[L,R],那么就相当于要求满足 (l[i]<=R && r[i]>=L)的i的个数。。。。。

    直接求不太好求,看起来又不太能容斥?? 别忘了 l[i]<=r[i] && L<=R 是隐藏条件,于是我们可以得出

    满足 (l[i]<=R && r[i]>=L)的i的个数

    就是

    (l[i]<=R)的i的个数

    减去

    (r[i]<L)的i的个数

(可以尝试画图验证)

    所以直接树状数组维护前缀和即可。

 

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=100005;

inline int read(){
    int x=0; char ch=getchar();
    for(;!isdigit(ch);ch=getchar());
    for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';
    return x;
}

int f[2][N],n,m,l,r,opt;

inline void add(int T,int x){
	for(;x<=n;x+=x&-x) f[T][x]++;
}

inline int query(int T,int x){
	int an=0;
	for(;x;x-=x&-x) an+=f[T][x];
	return an;
}

int main(){
	for(n=read(),m=read();m;m--){
		opt=read(),l=read(),r=read();
		if(opt==1) add(0,l),add(1,r);
		else printf("%d\n",query(0,r)-query(1,l-1));
	}
	return 0;
}

  

 

posted @ 2019-08-02 20:02  蒟蒻JHY  阅读(163)  评论(0编辑  收藏  举报