POJ 3067 Japan

来源:互联网 发布:朝鲜有多穷 知乎 编辑:程序博客网 时间:2024/06/05 16:48

题意:有两排城市,这两排之间有一些城市之间有连接的道路,给出所有道路,问有多少道路是相交的。实际上是求逆序数。
做法:先x升序,x相同y升序,用树状数组求逆序数。

#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>struct p{    int x,y;}a[1111*1111];int c[1111],n,m,k;bool comp(p a, p b){    if(a.x == b.x) return a.y < b.y;    return a.x < b.x;}int lowbit(int x){    return x&-x;}void update(int x,int w){    for(int i = x; i <= m ; i += lowbit(i))        c[i] += w;}int query(int x){    int ans = 0 ;    for(int i = x ; i > 0 ; i -= lowbit(i))        ans += c[i];    return ans;}using namespace std;int main(){    int t;    scanf("%d",&t);    for(int cas = 1 ; cas <= t ; cas++)    {        memset(c,0,sizeof(c));       scanf("%d%d%d",&n,&m,&k);       for(int i = 1 ; i <= k ; i++)        scanf("%d%d",&a[i].x,&a[i].y);       sort(a+1,a+1+k,comp);       long long ans = 0;       for(int i = 1 ; i <= k ; i++)       {           ans += (query(m) - query(a[i].y));           update(a[i].y,1);       }       printf("Test case %d: %I64d\n",cas,ans);    }    return 0;}
0 0
原创粉丝点击