• POJ2352:Stars——题解


    http://poj.org/problem?id=2352

    Astronomers晚上仰望星空,看到了很多星星。回到办公桌,Astronomers将这些星星画到二维坐标系,每个星星的坐标都是整数。例如5个星星,坐标分别为(1,1), (5,1), (7,1), (3,3), (5,5):

    Astronomers想对这些星星定等级,规则是这样的:每个星星左下角有几个星星,它就算几级(包含左边和下面)。上面的例子,第1颗星星的等级为0,等2颗星星的等级为1,第3颗星星的等级为2,第4颗星星的等级为1,第5颗星星的等级为3。

    所以,等级为0的星星有1颗,等级为1的星星有2颗,等级为2的星星有1颗,等级为3的星星有1颗,等级为4的星星为0颗。

    给定N个星星坐标,没有两个星星坐标在一起,问你等级为0~N-1的星星数量是多少。

    首先对于星星坐标按照先y后x排序,然后按照x的坐标加星星个数统计即可。

    ****注意星星坐标可能从0开始,所以最开始我们对坐标+1。

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    typedef long long ll;
    inline ll read(){
        int X=0,w=0; char ch=0;
        while(ch<'0'||ch>'9'){w|=ch=='-';ch=getchar();}
        while(ch>='0'&&ch<='9')X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
        return w?-X:X;
    }
    const int N=33000;
    struct node{
        int x;
        int y;
    }star[15001];
    bool cmp(node a,node b){
        if(a.y<b.y)return 1;
        if(a.y>b.y)return 0;
        if(a.x<b.x)return 1;
        return 0;
    }
    int n,m;
    ll tree[N];
    ll ans[15001];
    inline int lowbit(int t){return t&(-t);}
    void add(int x,int y){
        for(int i=x;i<=N;i+=lowbit(i))tree[i]+=y;
        return;
    }
    ll query(int x){
        ll res=0;
        for(int i=x;i>0;i-=lowbit(i))res+=tree[i];
        return res;
    }
    int main(){
        n=read();
        for(int i=1;i<=n;i++){
        star[i].x=read()+1;
        star[i].y=read()+1;
        }
        sort(star+1,star+n+1,cmp);
        for(int i=1;i<=n;i++){
        int t=query(star[i].x);
        ans[t]++;
        add(star[i].x,1);
        }
        for(int i=0;i<n;i++){
        printf("%lld
    ",ans[i]);
        }
        return 0;
    }
  • 相关阅读:
    C# 读取JSON
    checkbox与说明文字无法对齐的问题
    C#判断一个string是否为数字
    C# 调用系统winmm.dll 播放音乐wav mp3
    C#导出EXCEL的几种方法
    C#遍历DataSet中数据的几种方法总结
    cookie 简单用法
    JQGrid 在页面加载时展开SubGrid
    Echarts 设置地图上文字大小及颜色
    Echarts 地图上显示数值
  • 原文地址:https://www.cnblogs.com/luyouqi233/p/7886803.html
Copyright © 2020-2023  润新知