• [FZYZOJ 2080] [FJWC 2015] Screen



    P2080 -- [FJWC2015]Screen

    时间限制:1000MS

    内存限制:131072KB

    Description

    码农有一块超新星屏幕,它有N个像素点,每个像素点有亮度和灰度两个参数,记为I和H, 范围都是0~32000.

    一天,码农突发奇想,想知道哪个点比较容易亮瞎眼睛。为此,他定义了一个瞎眼指数: 瞎眼指数就是灰度和亮度均不大于该像素点的像素个数。

    现在,码农希望知道,瞎眼指数为0~N-1的像素点分别有多少个

    Input Format

    第一行一个数字N,代表有N个像素点。接下来N行,每行两个数字,代表该像素点的亮度和灰度。

    N个像素的亮度和灰度。像素按照灰度从小到大的顺序给出,(0 <= I, H <= 32000, N < 20000)

    Output Format

    瞎眼指数从0到H-1之间各等级的像素个数。

    Sample Input

    5
    1 1
    5 1
    7 1
    3 3
    5 5

    Sample Output

    1
    2
    1
    1
    0

    Hint

    注意有重点!

    ======================================

    AKF:“有没有可能有重点?”

    出题人:“没有”

    结果大部分人Wa了最后三个点,就是因为出题人的Datamaker是这样写的:

    ...

    node[i].x=rand()%32000;

    node[i].y=rand()%32000;

    ...

    【题解】

    和上一题一模一样嘛= =

    排序+树状数组随便写一写代码,注意判断重点。。。。

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int n,d[33005];
     4 int MAX=33001;
     5 struct P {
     6     int x,y;
     7 }p[100001];
     8 int ans[100001];
     9 int read() {
    10     int x=0,f=1;
    11     char ch=getchar();
    12     while(ch<'0'||ch>'9') {if(ch=='-') f=-1; ch=getchar();}
    13     while(ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();}
    14     return x*f;
    15 }
    16 bool cmp(P u,P v) {return (u.x<v.x)||(u.x==v.x&&u.y<v.y);}
    17 inline int lowbit(int x) {return x&(-x);}
    18 inline void add(int a,int v) {
    19     if(a<=0) return; 
    20     while(a<MAX) d[a]+=v,a+=lowbit(a);
    21 }
    22 inline int sum(int a) {
    23     if(a<=0) return 0;
    24     int ret=0;
    25     while(a>0) ret+=d[a],a-=lowbit(a);
    26     return ret;
    27 }
    28 int main() {
    29     int n;
    30     n=read();
    31     for (int i=1;i<=n;++i) p[i].x=read(),p[i].y=read();
    32     sort(p+1,p+n+1,cmp);
    33     int cnt=1;
    34     for (int i=1;i<=n;++i) {
    35         if (p[i].x==p[i+1].x && p[i].y==p[i+1].y) {++cnt;continue;}
    36         ans[sum(p[i].y+1)+cnt-1]+=cnt;
    37         add(p[i].y+1,cnt);
    38         cnt=1;
    39     }
    40     for (int i=0;i<n;++i) printf("%d
    ",ans[i]);
    41     return 0;
    42 }
    View Code
    这篇文章由TonyFang发布。 所有解释权归TonyFang所有。 Mailto: tony-fang@map-le.net
  • 相关阅读:
    HDU-统计难题
    POJ-A Simple Problem with Integers
    HDU-I Hate It
    个人站立会议06
    个人站立会议05
    个人站立会议04
    易校小程序典型用户需求分析
    个人站立会议03
    个人第二次晚间站立总结会议
    个人站立会议02
  • 原文地址:https://www.cnblogs.com/TonyNeal/p/fzyzoj2080.html
Copyright © 2020-2023  润新知