这是一道树状数组的题,对大神来说是不是很简单呀,可惜我不是=-=。。。。
简单说这题就是求逆序数,用树状数组快吧。。
上代码(show you the code!!)
#include <iostream>
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <string.h>
#define M 1000005
int c[M];
int n,m;
using namespace std;
int lowbit(int i)
{
return i&(-i);
}
int sum(int i)
{
int s=0;
while(i>0)
{
s+=c[i];
i-=lowbit(i);
}
return s;
}
void add(int x)
{
while(x<=n)
{
c[x]++;
x+=lowbit(x);
}
}
typedef struct link{int n;int m;}li;
li bit[M];
bool cmp(li a,li b)
{
if(a.m!=b.m)
return a.m<b.m;
else
return a.n<b.n;
}
int main()
{
//freopen("in.txt","r",stdin);
memset(c,0,sizeof(c));
int t;
int k;
scanf("%d",&t);
for(int i=1;i<=t;i++)
{
__int64 ans=0;
scanf("%d%d%d",&n,&m,&k);
for(int j=1;j<=k;j++)
{
scanf("%d%d",&bit[j].n,&bit[j].m);
}
sort(bit+1,bit+k+1,cmp);
for(int j=1;j<=k;j++)
{
add(bit[j].n);
ans+=j-sum(bit[j].n);
}
printf("Test case %d: %I64u\n",t,ans);
}
return 0;
}
样例都过了,可惜还是wa,以后再看看是哪里错了。
我终于知道自己哪里错了
有两点
1.数据范围问题,ans变量应该用long long型
2.还有一个弱智问题,应该输出的是case i,我输出了case t =-=
暴露了一个问题就是测试数据要注意两点,
1.测试多组数据,即t至少要取2;
2.数据取得太小了,没有代表性,这时只能看清题目的范围了。。
AC代码:
#include <iostream>
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <string.h>
#define M 2020
int c[M];
int n,m;
using namespace std;
int lowbit(int i)
{
return i&(-i);
}
long long sum(int i)
{
long long s=0;
while(i>0)
{
s+=c[i];
i-=lowbit(i);
}
return s;
}
void add(int x)
{
while(x<=n)
{
c[x]++;
x+=lowbit(x);
}
}
typedef struct link{int n;int m;}li;
li bit[M*M];
bool cmp(li a,li b)
{
if(a.m!=b.m)
return a.m<b.m;
else
return a.n<b.n;
}
int main()
{
freopen("in.txt","r",stdin);
int t;
int k;
scanf("%d",&t);
for(int i=1;i<=t;i++)
{
memset(c,0,sizeof(c));
long long ans=0;
scanf("%d%d%d",&n,&m,&k);
for(int j=1;j<=k;j++)
{
scanf("%d%d",&bit[j].n,&bit[j].m);
}
sort(bit+1,bit+k+1,cmp);
for(int j=1;j<=k;j++)
{
add(bit[j].n);
ans+=j-sum(bit[j].n);
}
printf("Test case %d: %lld\n",i,ans);
}
return 0;
}