计蒜客习题:棋子等级

问题描述

坐标系平面上有好多棋子,每个整点上至多有一个棋子。
假定棋子的等级是左下方的棋子个数,现在给出若干棋子的位置,求不同等级的棋子各有多少个。左下方包含正下和正右。说明(0, 0) 坐标的位置在左下角。
输入格式
第一行一个整数 N (1≤N≤100000)
接下来 N 行,一行两个整数 X,Y (0≤X,Y<100000),表示坐标。
数据保证坐标先按 Y 排序,再按 X 排序。

输出格式
N 行,每行一个整数,从 0 到 N−1 等级的棋子数量。
样例输入

5
1 1
5 1
7 1
3 3
5 5

样例输出

1
2
1
1
0

AC代码

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAX_N=(1e5)+50;
int C[MAX_N];
int ans[MAX_N];
int tot;

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

void change(int p,int v){
    for(;p<=tot;p+=lowbit(p)){
        C[p]+=v;
    }
    return;
}

int getsum(int p){
    int res=0;
    for(;p;p-=lowbit(p)){
        res+=C[p];
    }
    return res;
}

int main(){
    memset(ans,0,sizeof(ans));
    cin>>tot;
    for(int i=1;i<=tot;i++){
        int x,y;
        cin>>x>>y;
        x++;
        y++;
        ans[getsum(x)]++;
        change(x,1);
    }
    for(int i=0;i<tot;i++)cout<<ans[i]<<endl;
    return 0;

}

猜你喜欢

转载自blog.csdn.net/liukairui/article/details/80913686
今日推荐