ACM PKU 3067 Japan

树状数组的题,很简单,只是我做了一下午,哈哈!都是因为好久没有写代码了,这是个多组测试数据的题,初始化得注意点;树状数组的思想很简单,先排序,然后找交叉点,交叉点的数目等于A数组相对于x位置右边的sum值。

#include <iostream>
#include <algorithm>
#include <cstring>
#include <stdio.h>
using namespace std;
struct node {
        int e,w;
} tmp[1000010];
long long A[1005];
int MAX_N;

bool operator < (const node & a,const node &b)
{
    if(a.e==b.e) return a.w < b.w;
    return a.e<b.e;
}

int lowbit(int x)
{
    return (-x)&x;
}

void add(int x)
{
    for(;x>0;A[x]+=1,x-=lowbit(x));
}

long long  sum(int x){
    long long s=0;
    for(;x<=MAX_N;s+=A[x],x+=lowbit(x));
    return s;
 }
int main()
{
        //freopen("in.txt","r",stdin);
        int n_case,N,M,K;
        long long res;
        scanf("%d",&n_case);
        for(int i=0; i<n_case; i++) {
                scanf("%d%d%d",&N,&M,&K);
                res=0;MAX_N=M;
                memset(A,0,sizeof(A));
                for(int j=0; j<K; j++) {
                scanf("%d%d",&tmp[j].e,&tmp[j].w);
                }
                sort(tmp,tmp+K);
                for(int k=0;k<K;k++)
                {
                     res+=sum(tmp[k].w+1);
                     add(tmp[k].w);
                }
                printf("Test case %d: %I64d\n",i+1,res);
        }
        return 0;
}

 

转载于:https://www.cnblogs.com/Chinese-Coder-Clarence/articles/2415631.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值