【洛谷】【线段树】贪婪大陆

题目链接:https://www.luogu.org/problemnew/show/P2184

思路:维护两棵线段树+区间查询

我们来观察下面的情况↓

我们发现每个区间内的地雷种数=查询区间右端点左边L的个数-查询区间左端点左边R的个数

于是我们维护两棵线段树,一棵存L,一棵存R,区间查询作差即可

上代码↓

#include
#include
using namespace std;

const int MAXN=(1<<18-1);

int n,m,p,l,r;
int tree1[1<<18],tree2[1<<18];

int main(){
    scanf("%d%d",&n,&m);
    while(m--){
        scanf("%d%d%d",&p,&l,&r);
        if(p==1){
            for(int i=MAXN+l;i;i>>=1) ++tree1[i];
            for(int i=MAXN+r;i;i>>=1) ++tree2[i];
        }else{
            int le=MAXN;
            l+=MAXN;
            int sum1=0,sum2=0;
            while(le^l^1){
                if(~le&1) sum1+=tree2[le^1];
                if(l&1) sum1+=tree2[l^1];
                le>>=1;
                l>>=1;
            }le=MAXN;r=MAXN+r+1;
            while(le^r^1){
                if(~le&1) sum2+=tree1[le^1];
                if(r&1) sum2+=tree1[r^1];
                le>>=1;
                r>>=1;
            }printf("%d\n",sum2-sum1);
        }
    }return 0;
}

你可能感兴趣的:(题解,线段树)