POJ 3067 Japan

#include <stdio.h>
#include <algorithm>
#include <cstring>
#include <queue>

using namespace std;


struct node
{
    int l, r;
}a[1000*1001];

bool cmp(const node &a, const node &b)
{
    if(a.l == b.l)
        return a.r < b.r;
    return a.l < b.l;
}

struct fwtree
{
    int n;
    int C[3000];

    void clear(int kk){ memset(C, 0, sizeof(C)); n=kk;}

    int lowbit(int x)
    {
        return x&(-x);
    }

    void add(int x)
    {
        while(x<=n){
            C[x]++;
            x += lowbit(x);
        }
    }
    __int64 sum(int x)
    {
        __int64 ret = 0;
        while(x>0){
            ret += C[x];
            x -= lowbit(x);
        }
        return ret;
    }
};

fwtree f;
int main()
{
    int t, m, n, cas, flag = 0;
    __int64 ans;

    scanf("%d", &t);
    while(t--){
        scanf("%d%d%d", &n, &m, &cas);
        for(int i=1; i<=cas; i++){
            scanf("%d%d", &a[i].l, &a[i].r);
        }
        sort(a+1, a+cas+1, cmp);
        f.clear(m);
        ans = 0;

        for(int i=cas; i>=1; i--){
                ans += f.sum( a[i].r-1 );//自身不能加上,另种写法(从0开始)是 i-f.sum(a[i].r); 已经去掉了自身。
            f.add( a[i].r );
        }
     printf("Test case %d: %I64d\n", ++flag, ans);
    }

    return 0;
}

你可能感兴趣的:(POJ 3067 Japan)