poj 2352 & Ural 1028 数星星 题解

一道水题,由于x坐标递增y坐标也递增于是前缀和统计即可,用树状数组实现。

#include<bits/stdc++.h>
using namespace std;
const int maxn=15010;
const int maxx=32010;
inline long long read(){
    long long x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        x=(x<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
    return x*f;
}
long long n,c[maxx],ans[maxn];
long long lowbit(long long x){
    return x&(-x);
}
void add(long long x){
    for(x;x<=maxx;x+=lowbit(x)) c[x]+=1;
}
long long ask(long long x){
    long long tmp=0;
    for(;x;x-=lowbit(x)) tmp+=c[x];
    return tmp;
}
int main(){
    n=read();
    for(long long i=1;i<=n;++i){
        long long x,y;
        x=read();y=read();
        long long s=ask(x+1);
        add(x+1);
        ans[s]++;
    }
    for(long long i=0;i<n;++i){
        printf("%lld\n",ans[i]);
    }

    return 0;
}
/*
5
1 1
5 1
7 1
3 3
5 5
*/

原文地址:https://www.cnblogs.com/donkey2603089141/p/11415476.html

时间: 2024-10-12 02:48:07

poj 2352 & Ural 1028 数星星 题解的相关文章

poj 2352 Stars 数星星 详解

题目: poj 2352 Stars 数星星 题意:已知n个星星的坐标.每个星星都有一个等级,数值等于坐标系内纵坐标和横坐标皆不大于它的星星的个数.星星的坐标按照纵坐标从小到大的顺序给出,纵坐标相同时则按照横坐标从小到大输出. (0 <= x, y <= 32000) 要求输出等级0到n-1之间各等级的星星个数. 分析: 这道题不难想到n平方的算法,即从纵坐标最小的开始搜,每次找它前面横坐标的值比它小的点的个数,两个for循环搞定,但是会超时. 所以需要用一些数据结构去优化,主要是优化找 横坐

POJ 1028 Web Navigation 题解

考查代码能力的题目.也可以说是算法水题,呵呵. 推荐新手练习代码能力. 要增加难度就使用纯C实现一下stack,那么就有点难度了,可以使用数组模拟环形栈.做多了,我就直接使用STL了. #include <stdio.h> #include <iostream> #include <stack> #include <string> using namespace std; int main() { stack<string> forward; s

hdu 1541/poj 2352:Stars(树状数组,经典题)

Stars Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4052    Accepted Submission(s): 1592 Problem Description Astronomers often examine star maps where stars are represented by points on a plan

一本通1536数星星 Stars

1536:[例 2]数星星 Stars 时间限制: 256 ms         内存限制: 65536 KB [题目描述] 原题来自:Ural 1028 天空中有一些星星,这些星星都在不同的位置,每个星星有个坐标.如果一个星星的左下方(包含正左和正下)有 k 颗星星,就说这颗星星是 k 级的. 例如,上图中星星 5 是 3 级的(1,2,4 在它左下),星星 2,4 是 1 级的.例图中有 1 个 0 级,2 个 1 级,1 个 2 级,1 个 3 级的星星. 给定星星的位置,输出各级星星的数

#10114 「一本通 4.1 例 2」数星星 Stars

1536:[例 2]数星星 Stars 时间限制: 256 ms         内存限制: 65536 KB提交数: 630     通过数: 282 [题目描述] 原题来自:Ural 1028 天空中有一些星星,这些星星都在不同的位置,每个星星有个坐标.如果一个星星的左下方(包含正左和正下)有 kk 颗星星,就说这颗星星是 kk 级的. 例如,上图中星星 55 是 33 级的(1,2,41,2,4 在它左下),星星 2,42,4 是 11 级的.例图中有 11 个 00 级,22 个 11 

POJ - 2352 - Stars

题目链接:POJ - 2352 题目大意: 给你N个星星的坐标,问每个星星的左下角有几颗星星. 注意输入坐标y是按递增输入的. 题目分析: 算是树状数组的一个基础题目吧,有些题目也是以这道题为基础的. 直接运用数组数组即可,具体看代码. 不过注意由于x坐标有可能是0,所以要对所有的X坐标加一(不要忘了区间上界也要增大一个), 防止add()函数出现死循环超时. 给出代码: 1 #include<cstdio> 2 #include<cstdlib> 3 #include<cs

poj 2352 Stars (树状数组)

Stars Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 37108   Accepted: 16173 Description Astronomers often examine star maps where stars are represented by points on a plane and each star has Cartesian coordinates. Let the level of a st

POJ 2352 (stars)

[题意描述] 就是给定n个星星的x,y坐标,y坐标按照从小到大的顺序进行排列,x坐标随机排列.下面求对于每个星星而言,其它星星的x,y的坐标都小于等于该星星的数目,然后输出所有的情况. [思路分析] 我们这道题可以采用树状数组求解,将x+1作为树状数组的底标. [AC代码] #include<iostream> #include<bitset> #include<cstdio> #include<cstring> #include<algorithm&

1144 数星星 (树状数组)

1144 数星星 该题有题解 时间限制:564MS  内存限制:65536K提交次数:193 通过次数:43 题型: 编程题   语言: G++;GCC Description 天文学家们喜欢观察星星.它们把每颗星星看成一个点,并把每颗星星左下方(即横坐标和纵坐标都不比它大)的星星颗数作为它的等级值. 现给出所有星星(星星个数为N)的坐标,计算并输出指定编号的星星的等级. 注意:不存在相同坐标的星星 输入格式 第一行为N 后N行为编号为1到N的星星的坐标(坐标用整数) 此后是M 后一行是M个星星