65,208
社区成员
发帖
与我相关
我的任务
分享

#include<cstdio>
#include<cstdlib>
class lighthouse{
public:
long x;
long y;
};
int cmp(const void* a, const void* b)
{
if (((lighthouse *)a)->x < ((lighthouse *)b)->x)
return -1;
else if (((lighthouse *)a)->x > ((lighthouse *)b)->x)
return 1;
else
return 0;
}
void merge(lighthouse * A, long lo, long mi, long hi, long & n)
{
lighthouse * a = A + lo;
long lb = mi - lo;
lighthouse * B = new lighthouse[lb];
for (long i = 0; i < lb; B[i] = a[i++]);
long lc = hi - mi;
lighthouse * C = A + mi;
for (long i = 0, j = 0, k = 0; j < lb;){
if (k < lc && C[k].y < B[j].y)
a[i++] = C[k++];
if (lc <= k || B[j].y <= C[k].y){
a[i++] = B[j++];
n += lc - k;
}
}
delete[] B;
}
void mergesort(lighthouse * A, long lo, long hi, long & n)
{
if (hi - lo < 2)
return;
long mi = (lo + hi) >> 1;
mergesort(A, lo, mi, n);
mergesort(A, mi, hi, n);
merge(A, lo, mi, hi, n);
}
int main()
{
long n;
scanf("%ld",&n);
lighthouse * p = new lighthouse[n];
for(long i = 0; i < n; ++i)
scanf("%ld%ld",&p[i].x,&p[i].y);
qsort(p, n, sizeof(lighthouse), cmp);
long num = 0;
mergesort(p, 0, n, num);
printf("%ld",num);
return 0;
}
限制
对于90%的测例:1 ≤ n ≤ 3×10^5
对于95%的测例:1 ≤ n ≤ 10^6
全部测例:1 ≤ n ≤ 4×10^6
灯塔的坐标x, y是整数,且不同灯塔的x, y坐标均互异
1 ≤ x, y ≤ 10^7
提醒
注意机器中整型变量的范围,C/C++中的int类型通常被编译成32位整数,其范围为[-231, 231 - 1],不一定足够容纳本题的输出。
时间:2s,内存:256MB
就是最后一个测例超时了,一共20个测例
AC就不能互亮