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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章