[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\n",ans[i]);
41     return 0;
42 }
View Code

 

posted @ 2015-06-06 12:01  TonyFang  阅读(1297)  评论(0编辑  收藏  举报