1. 程式人生 > >【codevs2147】數星星

【codevs2147】數星星

題目描述 Description

小明是一名天文愛好者,他喜歡晚上看星星。這天,他從淘寶上買下來了一個高階望遠鏡。他十分開心,於是他晚上去操場上看星星。

不同的星星發出不同的光,他的望遠鏡可以計算出觀測到的星星發出的光的數值W。小明當然想盡可能地多看到星星,於是他每看到一顆星星,就要看看他之前有沒有看過這顆星星。但是他看的星星太多了,他根本數不過來,於是他讓你幫忙。

輸入描述 Input Description

共有兩行,第一行只有一個整數,為小明觀測到的星星的數量n。第二行有n個整數,每兩個整數由一個空格隔開,分別為小明觀測到每顆星星的光的數值W[1]-W[n]。

輸出描述 Output Description

只有一行,這一行共有n個數字0或1。0表示對應的星星之前沒有觀測到,1表示對應的星星之前已經看過了。注意:數字之間沒有空格!

樣例輸入 Sample Input

5

1 5 5 4 1

樣例輸出 Sample Output
00101
資料範圍及提示 Data Size & Hint

樣例是往往是騙人的,本題中

30%的資料,0<n≤5000。

20%的資料,-20000≤W≤20000。

60%的資料,0<n≤50000。

100%的資料,0<n≤500000;-2000000000≤W≤2000000000。

【題解】

離散化之後排序模擬一下

【程式碼】

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
struct hp{
	int num,val;
}a[500005];
int n,b[500005];
int cmp(hp a,hp b){
	return (a.val<b.val||a.val==b.val&&a.num<b.num);
}
int main(){
	scanf("%d",&n);
	for (int i=1;i<=n;++i) scanf("%d",&a[i].val),a[i].num=i;
	sort(a+1,a+n+1,cmp);
	for (int i=1;i<=n;++i)
	  if (i==1||a[i].val!=a[i-1].val) b[a[i].num]=0;
	  else b[a[i].num]=1;
	for (int i=1;i<=n;++i)
	  printf("%d",b[i]);
}