HDU 4325 Flowers(二分查找求上界)

题目链接

这是线段树的模版题。我用二分查找做的,自己二分太弱了,最近一直发现我不会写二分,在我还没有调试出二分查找求上界的时候,队友已经用线段树过了。。。。又托了好久,今天想起来,系统的学习一下二分。

 1 #include <stdio.h>

 2 #include <string.h>

 3 #include <stdlib.h>

 4 struct node

 5 {

 6     __int64 da;

 7     int id;

 8 }p[200001];

 9 int cmp(const void *a,const void *b)

10 {

11     return (*(struct node *)a).da > (*(struct node *)b).da?1:-1;

12 }

13 __int64 o1[200001],o2[200001];

14 int main()

15 {

16     int n,i,j,num = 0,t,m;

17     __int64 max,st,ed,mi,w;

18     scanf("%d",&t);

19     while(t--)

20     {

21         scanf("%d%d",&n,&m);

22         memset(p,0,sizeof(p));

23         memset(o1,0,sizeof(o1));

24         memset(o2,0,sizeof(o2));

25         num ++;

26         max = 0;

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

28         {

29             scanf("%I64d%I64d",&p[2*i-2].da,&p[2*i-1].da);

30             p[2*i-1].da ++;

31             p[2*i-2].id = 1;

32             p[2*i-1].id= 0;

33             if(max < p[2*i-1].da)

34             max =p[2*i-1].da;

35         }

36         qsort(p,2*n,sizeof(p[0]),cmp);

37         if(p[0].id)

38         o2[0] ++;

39         o1[0] = p[0].da;

40         for(i = 1;i <= 2*n-1;i ++)

41         {

42             o1[i] = p[i].da;

43             if(p[i].id)

44             o2[i] = o2[i-1]+1;

45             else

46             o2[i] = o2[i-1]-1;

47         }

48         j = 0;

49         for(i = 0;i <= 2*n-2;i ++)

50         {

51             if(o1[i] != o1[i+1])

52             {

53                 o1[j] = o1[i];

54                 o2[j] = o2[i];

55                 j ++;

56             }

57         }

58         o1[j] = o1[2*n-1];

59         o2[j] = o2[2*n-1];

60         printf("Case #%d:\n",num);

61         for(i = 1;i <= m;i ++)

62         {

63             scanf("%I64d",&w);

64             if(w < o1[0])//特判

65             {

66                 printf("0\n");

67                 continue;

68             }

69             st = 0;ed = j;

70             while(st < ed)

71             {

72                 mi = (st + ed + 1)/2;//注意

73                 if(o1[mi] > w)

74                 ed = mi-1;//注意

75                 else

76                 st = mi;

77             }

78             printf("%I64d\n",o2[ed]);

79         }

80     }

81     return 0;

82 }

你可能感兴趣的:(二分查找)