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 }