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 }