现在的位置: 首页 > 综合 > 正文

poj 3067 Japan(树状数组)

2018年03月17日 ⁄ 综合 ⁄ 共 996字 ⁄ 字号 评论关闭
题意:东西两岸有N,M座城市 从北到南标号分别为1...N or M 在它们之间建铁路,每个站最多只能有两条铁路
求总的交点数

思路:各连线按x降序(x相同,y降序)重排 再以y 建树状数组 注意有重边的情况
比如:
3
1 2 2
1 2
1 2
输出应是 0
还有要用__int64存

//2764K   
516MS

#include <stdio.h>
#include <string.h>
#include <algorithm>
#define lowbit(x) (x&(-x))
#define M 1050

using namespace std;
struct data
{
    int
x,y;
}node[M*M];
__int64 ar[M];

bool cmp (const data &a,const data
&b)
{
    if (a.x
> b.x)
       
return true;
    if (a.x ==
b.x&&a.y >
b.y)
       
return true;
    return
false;
}

void add (int u)
{
    while (u
< M)
       
ar[u] += 1,u += lowbit(u);
}
__int64 sum (int u)
{
    __int64 ans
= 0;
    while (u
> 0)
    {
       
ans += ar[u];
       
u -= lowbit(u);
    }
    return
ans;
}
int main ()
{
    int
i,t,n,m,k;
    int count =
0;
    scanf
("%d",&t);
    while (t
--)
    {
       
scanf
("%d%d%d",&n,&m,&k);

       
memset (ar,0,sizeof (ar));

       
for (i = 0;i < k;i ++)
           
scanf
("%d%d",&node[i].x,&node[i].y);

       
sort (node,node + k,cmp);
       
__int64 ans = 0;
       
for (i = 0;i < k;i ++)
       
{
           
ans += sum (node[i].y -1);
           
add (node[i].y);
       
}
       
printf ("Test case %d: %I64d\n",++count,ans);
    }
    return
0;
}

抱歉!评论已关闭.