现在的位置: 首页 > 综合 > 正文

poj 3067

2018年04月21日 ⁄ 综合 ⁄ 共 745字 ⁄ 字号 评论关闭

逆序数 树状数组

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef __int64 ll;
int const MAXN = 1010;
int c[MAXN * 2];
struct City{
    int e,w;
}city[MAXN * 1000];
bool cmp(City a,City b){
    if(a.w == b.w) return a.e < b.e;
    return a.w < b.w;
}
int LowBit(int x){
    return x & (-x);
}
void Add(int x,int d){
    while(x <= MAXN){
        c[x] += d;
        x += LowBit(x);
    }
}
int Sum(int x){
    int ret = 0;
    while(x > 0){
        ret += c[x];
        x -= LowBit(x);
    }
    return ret;
}
int main(){
    int t;
    while(~scanf("%d",&t)){
       for(int temp = 1;temp <= t;temp++){
            memset(c,0,sizeof(c));
            int n,m,k;
            scanf("%d%d%d",&n,&m,&k);
            for(int i = 1;i <= k;i++){
                scanf("%d%d",&city[i].e,&city[i].w);
                city[i].e++;
                city[i].w++;
            }
            sort(city+1,city+1+k,cmp);
            ll sum = 0;
            for(int i = 1;i <= k;i++){
                Add(city[i].e,1);
                sum += i - Sum(city[i].e);
            }
            printf("Test case %d: %I64d\n",temp,sum);
       }
    }
    return 0;
}

【上篇】
【下篇】

抱歉!评论已关闭.