hdu 5233 离散化 **

题意:很久很久以前,有一个叫Jack的枪手。他非常喜欢打猎。一天,他去了一个小树林。那儿有n只鸟,还有n棵树。第i只鸟站在第i棵树的顶端。这些树从左到右排成一条直线。每一棵树都有它的高度。Jack站在最左边那棵树的左边。当Jack在高度为H的地方向右发射一棵子弹时,站在高度为H的树上且离Jack最近的鸟儿就会落下来。 Jack会射击多次,他想知道每次射击哪只鸟儿会落下来。

怎么看都是以前出过的题啊,但还是不会

明早起来拍一遍

2015-05-26:

 1 #include<cstdio>

 2 #include<iostream>

 3 #include<algorithm>

 4 #include<cstring>

 5 #include<cmath>

 6 #include<queue>

 7 #include<map>

 8 #include<set>

 9 using namespace std;

10 #define MOD 1000000007

11 const int INF=0x3f3f3f3f;

12 const double eps=1e-5;

13 typedef long long ll;

14 #define cl(a) memset(a,0,sizeof(a))

15 #define ts printf("*****\n");

16 const int MAXN=100005;

17 int a[MAXN],b[MAXN];

18 int n,m,tt;

19 set<int> vc[MAXN];

20 int main()

21 {

22     int i,j,k;

23     #ifndef ONLINE_JUDGE

24     freopen("1.in","r",stdin);

25     #endif

26     while(scanf("%d%d",&n,&m)!=EOF)

27     {

28         for(i=0;i<n;i++)

29         {

30             scanf("%d",a+i);

31             b[i]=a[i];

32         }

33         sort(b,b+n);

34         int num=unique(b,b+n)-b-1;

35         for(i=0;i<=num;++i)

36             vc[i].clear();

37         for(i=0;i<n;i++)

38         {

39             vc[lower_bound(b,b+num,a[i])-b].insert(i);   //vc[高度]=编号,高度是离散化之后的高度

40         }

41         int H;

42         for(i=0;i<m;i++)

43         {

44             scanf("%d",&H);

45             int HH=lower_bound(b,b+num,H)-b;

46             if(b[HH]!=H||vc[HH].empty())

47             {

48                 printf("-1\n");

49             }

50             else

51             {

52                 printf("%d\n",*vc[HH].begin()+1);

53                 vc[HH].erase(vc[HH].begin());

54             }

55         }

56     }

57 }
 
  

 

 
 1 #include<iostream>

 2 #include<cstdio>

 3 #include<cstdlib>

 4 #include<cstring>

 5 #include<cmath>

 6 #include<algorithm>

 7 #include<vector>

 8 #include<set>

 9 #define maxn 100010

10 using namespace std;

11 typedef long long LL;

12 typedef unsigned long long ULL;

13 set<int> bird[maxn];

14 int n,m,tn,h[maxn];

15 int tmp[maxn];

16 void read()

17 {

18     for(int i=1;i<=n;++i)

19     {

20         scanf("%d",h+i);

21         tmp[i]=h[i];

22     }

23     sort(tmp+1,tmp+n+1);

24     tn=unique(tmp+1,tmp+n+1)-tmp-1;

25     for(int i=1;i<=tn;++i)

26         bird[i].clear();

27     for(int i=1;i<=n;++i)

28         bird[lower_bound(tmp+1,tmp+tn+1,h[i])-tmp].insert(i);

29 }

30 void Query()

31 {

32     for(int i=1,x;i<=m;++i)

33     {

34         scanf("%d",&x);

35         int id=lower_bound(tmp+1,tmp+tn+1,x)-tmp;

36         if(tmp[id]!=x)  //没找到

37             printf("-1\n");

38         else if(bird[id].empty())

39             printf("-1\n");

40         else

41         {

42             printf("%d\n",*bird[id].begin());

43             bird[id].erase(bird[id].begin());

44         }

45     }

46 }

47 int main()

48 {

49     while(cin>>n>>m)

50     {

51         read();

52         Query();

53     }

54     return 0;

55 }
 
  

 




你可能感兴趣的:(HDU)