hdu-1556

BIT

思路比较清奇:在a点加一在b+1点加-1,这样在算结果sum(i)的时候就从区间查询变成了点查询了。开阔了一点点思维。

#include<bits/stdc++.h>
#define _for(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
typedef long long ll;
const int mod =1e6+7;
double esp=1e-6;
int INF =0x3f3f3f3f;
const int inf = 1<<28;
const int MAXN=1e5+10;
int N;
int c[MAXN];
int lowbit(int x)
{
    return x&-x;
}
int sum(int x)
{
    int ret=0;
    while(x>0)
    {
        ret+=c[x];x-=lowbit(x);
    }
    return ret;
}
void add(int i ,int val)
{
    while(i<=N)
    {
        c[i]+=val;
        i+=lowbit(i);
    }
}
int main()
{
    while(scanf("%d",&N)&&N!=0)
    {
        memset(c,0,sizeof(c));
        int a,b;
        for(int i=1;i<=N;i++)
        {
            scanf("%d%d",&a,&b);
            add(a,1);
            add(b+1,-1);
        }
        for(int i=1;i<=N;i++)
        {
            if(i==1)printf("%d",sum(i));
            else printf(" %d",sum(i));
        }
        printf("
");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/kayiko/p/12295907.html