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 }
posted @ 2012-08-05 17:25  Naix_x  阅读(225)  评论(0编辑  收藏  举报