poj3067 树状数组+优先队列 如果让我说:我只能说,实力代表一切

来源:互联网 发布:网络切换器设置 编辑:程序博客网 时间:2024/04/27 15:21

 

题意:在一个弹丸之地,有两排城市,每两个城市之间有一条道路相连,问有多少个可以产生交际

思路:利用树状数组,求逆序数。首先对道路进行排序,然后求解。

#include<iostream>#include<algorithm>#include<cstdio>#include<queue>#include<string.h>using namespace std;int c[1050];int Max;struct node{    int x;    int y;    bool friend operator <(const node &a,const node &b)    {        if(a.x!=b.x)            return a.x>b.x;        else            return a.y>b.y;    }};priority_queue<node>Q;int lowbit(int n){    return (-n)&n;}long long get_sum(int n){    long long ans=0;    while(n<=1010)    {         ans+=c[n];         n+=lowbit(n);    }    return ans;}void up_data(int n){    while(n>0)    {        c[n]++;        n-=lowbit(n);    }}int main(){    int T;    scanf("%d",&T);    int N,M,K;    long long TestAns;    node tem;    for(int t=1;t<=T;t++)    {        memset(c,0,sizeof(c));        scanf("%d%d%d",&N,&M,&K);        for(int i=0; i<K; i++)        {            scanf("%d%d",&tem.x,&tem.y);            Q.push(tem);        }        int Max=M;         TestAns=0;        for(int i=0; i<K; i++)        {            tem=Q.top();            Q.pop();            TestAns+=get_sum(tem.y+1);           // printf("%I64d\n",TestAns);            up_data(tem.y);        }        printf("Test case %d: %I64d\n",t,TestAns);    }    return 0;}

原创粉丝点击