MDeath-Kid

- M I T & Y
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

POJ 3067

Posted on 2011-07-21 16:50  MDeath-Kid  阅读(146)  评论(0编辑  收藏  举报

求相交的公路,对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);
}
}