求相交的公路,对N排序,然后对M求逆序对,不过要求有相交的,必然要求在次城市后面,所以int sumge = i - (qur(s[tmp].y)) - ge;,这里修改了老多次,不过还好1Y了。
3067
#define lowbit(x) x & -x
struct sta
{
int x,y;
};
sta s[MAXN];
int n,m,k,maxx;
int num[1005];
int cmp(const void *a,const void *b)
{
struct sta *c = (sta *)a;
struct sta *d = (sta *)b;
if(c->x == d->x)
{
return c->y - d->y;
}
return c->x - d->x;
}
void add(int x,int va)
{
while(x <= m)
{
num[x] += va;
x += lowbit(x);
}
}
int qur(int x)
{
int s=0;
while(x)
{
s += num[x];
x -= lowbit(x);
}
return s;
}
int main()
{
//FOPEN;
int ces,a,b,kk = 0;SCF(ces);
while(ces--)
{
SET(num,0);
int tmp;
long long sum=0;
SCFT(n,m,k);
F(i,k)
{
SCFD(a,b);
s[i].x=a;
s[i].y=b;
}
qsort(s,k,sizeof(s[0]),cmp);
//DB(s[3].y);
for(int i=0;i<k;)
{
tmp = i;
while((i<k)&&s[i].y==s[tmp].y)
i++;
int ge = i - tmp;
int sumge = i - (qur(s[tmp].y)) - ge;
sum += sumge*ge;
//DB("ge="<<ge<<" sumge="<<sumge<<" qur="<<qur(s[tmp].y));
//DB(sum<<"--");
add(s[tmp].y,ge);
}
printf("Test case %d: %lld\n",++kk,sum);
}
}