洛谷 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; }
我爱学习,学习使我快乐