poj3067

樹狀數組。在這裏提示兩個好習慣,輸入輸出用‘scanf‘printf’,據說比’cin’cout‘快10倍吧,第一遍就因爲這個超時,還有定義sum值時,最好用long long,畢竟不是超大數組,多幾個,可以減少不必要的麻煩,當然這個視具體情況而定。本題用樹狀數組求逆序對數,代碼附下。

#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <memory.h>
using namespace std;

int n,m,k;
struct node{
   int a,b;
}t[1000005];
int c[1000005];

int cmp(node p,node q)
{
    if(p.a < q.a)  return 1;
    else if(p.a == q.a && p.b < q.b)  return 1;
    else  return 0;
}

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

void update(int i,int j)
{
    while(i <= m){
       c[i] += j;
       i += lowbit(i);
    }
}

__int64 getsum(int i)
{
    __int64 sum = 0;
    while(i > 0){
       sum += c[i];
       i -= lowbit(i);
    }
    return sum;
}

int main()
{
    int T,t0 = 1;cin >> T;
    while(T --){
       scanf("%d %d %d",&n,&m,&k);
       memset(c,0,sizeof(c));
       for(int i = 1;i <= k;i ++)
          scanf("%d %d",&t[i].a,&t[i].b);
       sort(t + 1,t + k + 1,cmp);
       __int64 sum = 0;
       for(int i = 1;i <= k;i ++){
          update(t[i].b,1);
          sum += i - getsum(t[i].b);
       }
       printf("Test case %d: %I64d\n",t0 ++,sum);
    }
    return 0;
}



發佈了69 篇原創文章 · 獲贊 1 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章