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\n", get_sum(tre_h, r)-get_sum(tre_t, l-1));
    }
    return 0;
}
posted @ 2019-06-04 13:34  Santiego  阅读(144)  评论(0编辑  收藏  举报