对这个知识不熟啊。。。。自己找了一篇论文,上边一个题,貌似和这个差不多,谁知一点都不一样,怎么也不理解如何通过更改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 }