對這個知識不熟啊。。。。自己找了一篇論文,上邊一個題,貌似和這個差不多,誰知一點都不一樣,怎么也不理解如何通過更改a b之間的全部+1,通過樹狀數組中更新數組的a和b+1,來操作。。。。實在理解了不了,看了解題報告發現和論文上的題,不一樣啊。。。只需要insert(a,1)和insert(b+1,-1)就好了,瞬間我被秒了,意義馬上就理解了。。。
1 #include <stdio.h> 2 #include <string.h> 3 #define N 100001 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 a,b,i,sum; 30 while(scanf("%d",&n)!=EOF) 31 { 32 memset(p,0,sizeof(p)); 33 if(!n) break; 34 for(i = 1; i <= n; i ++) 35 { 36 scanf("%d%d",&a,&b); 37 insert(a,1); 38 insert(b+1,-1); 39 } 40 for(i = 1; i <= n; i ++) 41 { 42 sum = getsum(i); 43 if(i == 1) 44 printf("%d",sum); 45 else 46 printf(" %d",sum); 47 } 48 printf("\n"); 49 } 50 return 0; 51 }