Time Limit: 9000/3000 MS (Java/Others)
Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 26275
Accepted Submission(s): 12734
当N = 0,输入结束。
随意举个例子,比如最开始c和d都是0,我们先涂1~3,则需要d[1]++,d[3+1]--;意味着第1个下标应该比第0个下标的c值多1(实际上是多了d[1],这里刚修改过一次所以是1),而第4个下标应该比第3个下标的c值少1(同上)。
假如这个时候没输入完,我们还不能就这么早求c。在上面的基础上再输入一组,涂2~3,显然这样子结束以后我们要输出的c是:1,2,2。试一下看看对不对。
希望这次的图示讲解能把前缀和的大概意思讲明白。这样子有兴趣的同学可以回去重做一下POJ3263,基本思路是一样的,只是区间开闭不同。
此次代码没有注释,因为上面已经解释得差不多了。
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 using namespace std; 6 7 int n,a,b; 8 int d[100005],c[100005]; 9 10 int main() 11 { 12 while(~scanf("%d",&n)&&n) 13 { 14 memset(d,0,sizeof(d)); 15 memset(c,0,sizeof(c)); 16 for(int i=1;i<=n;i++) 17 { 18 scanf("%d%d",&a,&b); 19 if(a>b) swap(a,b); 20 d[a]++; 21 d[b+1]--; 22 } 23 for(int i=1;i<=n;i++) 24 c[i]=c[i-1]+d[i],printf("%d%c",c[i]," \n"[i==n]); 25 } 26 return 0; 27 }