比赛时遇见了个二维差分,很可惜没看出来,还想用线段树维护,wtcl。痛心之余,回来补一补差分。
差分一般用来解决区间操作,而区间操作当然可以用线段树写,但相比较下,差分更好实现而且更快,不过差分只能处理离线问题,不能一边更新一边查询。
差分的思想很简单,我们要在一个区间[l,r]内都加上一个数a,那么像树状数组去区间更新一样,我们弄一个差分数组,在dif[l]处+a,在dif[r+1]处-a,这样像前缀和一样扫过l到r这个区间时,在l处开始有+a,+a对[l,r]区间产生影响,在r+1处-a变回原来的值,对r+1后面的区间没有了影响
Color the ball HDU - 1556
题目大意:n个点,n次操作,每次对一个区间涂色,最后问每个点被涂了多少次。
1 #include<cstdio> 2 const int N=100118; 3 int cov[N],l,r; 4 int main() 5 { 6 int n; 7 while(scanf("%d",&n)&&n) 8 { 9 for(int i=1;i<=n;i++) 10 cov[i]=0; 11 for(int i=1;i<=n;i++) 12 { 13 scanf("%d%d",&l,&r); 14 cov[l]++; 15 cov[r+1]--; 16 } 17 for(int i=1;i<=n;i++) 18 { 19 if(i>1) 20 printf(" "); 21 cov[i]+=cov[i-1]; 22 printf("%d",cov[i]); 23 } 24 printf("\n"); 25 } 26 return 0; 27 }