HDU 4217 Data Structure?(树状数组+二分)

题目链接

看到题目,没想到有什么好办法,也想到了树状数组,然后二分查找。。。本来感觉复杂度特别高,交了几次超时,然后我发现看别人用相同思路却过了,我写的可能死循环了。

不过没查到数据,也可能效率低了。

查查白书看看书上代码。

while(str < end)//二分找到关键值
{
    mid = str+(end-str)/2;
    if(p[mid] == a)
        break;
    else if(p[mid] > a)
        end = mid;
    else 
        str = mid+1;
}

此题代码

 1 #include <stdio.h>
 2 #include <string.h>
 3 #define N 270000
 4 int p[N],n;
 5 int lowbit(int t)
 6 {
 7     return t&(-t);
 8 }
 9 void insert(int t,int d)
10 {
11     while(t <= n)
12     {
13         p[t] += d;
14         t += lowbit(t);
15     }
16 }
17 int getsum(int t)
18 {
19     int sum = 0;
20     while(t > 0)
21     {
22         sum += p[t];
23         t -= lowbit(t);
24     }
25     return sum;
26 }
27 int main()
28 {
29     int i,k,a,str,end,mid,midsum,num = 1,t;
30     __int64 sum;
31     scanf("%d",&t);
32     while(num <= t)
33     {
34         scanf("%d%d",&n,&k);
35         memset(p,0,sizeof(p));
36         for(i = 1; i <= n; i ++)
37         {
38             insert(i,1);
39         }
40         sum = 0;
41         for(i = 1; i <= k; i ++)
42         {
43             scanf("%d",&a);
44             str = 1;
45             end = n;
46             while(str < end)
47             {
48                 mid = (str+end)/2;
49                 midsum = getsum(mid);
50                 if(midsum < a)
51                     str = mid+1;
52                 else
53                     end = mid;
54             }
55             sum += str;
56             insert(str,-1);
57         }
58         printf("Case %d: ",num);
59         printf("%I64d\n",sum);
60         num ++;
61     }
62     return 0;
63 }

 

 

posted @ 2012-07-21 20:55  Naix_x  阅读(231)  评论(0编辑  收藏  举报