P2184 贪婪大陆

P2184 贪婪大陆

用树状数组记录前(i)长度共有(sum1)个区间结束,前(j)长度共用(sum2)个区间开始,答案显然为(sum2-sum1)

善用指针减少代码量:

#include <cstdio>
#define MAXN 100010
#define lowbit(x) ((x)&(-(x)))
using namespace std;
int n,m;
int tre_h[MAXN], tre_t[MAXN];
void add(int *a, int x, int val){
    for(register int i=x;i<=n;i+=lowbit(i))
        *(a+i)+=val;
}
int get_sum(int *a, int x){
    int ans=0;
    for(register int i=x;i>0;i-=lowbit(i)){
        ans+=*(a+i);
    }
    return ans;
}
int main()
{
    scanf("%d %d", &n, &m);
    while(m--){
        int opt,l,r;scanf("%d %d %d", &opt, &l, &r);
        if(opt==1) add(tre_h, l, 1),add(tre_t, r, 1);
        else printf("%d
", get_sum(tre_h, r)-get_sum(tre_t, l-1));
    }
    return 0;
}
原文地址:https://www.cnblogs.com/santiego/p/10973016.html