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 }

 

 

你可能感兴趣的:(struct)