题目: http://acm.nyist.net/JudgeOnline/problem.php?pid=228
由于该题一开始是进行士兵军功增加,最后才是查找士兵的军功总和,使用一个数组,进行延迟更新(就是某段进行添加时吧首位进行标记,最后一位的下一位进行标记)
然后进行一次总的更新,求和
这个题值得注意的是,该题的士兵编号是从0开始 而不是1开始,
代码
#include <stdio.h>
#include <string.h>#define MOD 10003int a[1000005];int main()
{memset(a,0,sizeof(a));int n,m,q;scanf("%d%d%d",&n,&m,&q);int x,y,z;while(m--){scanf("%d%d%d",&x,&y,&z);a[x] += z;if(y+1 <= n)a[y+1] -= z;}int i;/*for(i = 1; i <= n; i++)printf("%d ",a[i]);printf("\n");*/int ans = 0;for(i = 0; i <= n; i++){ans += a[i];a[i] = ( ans + a[i-1] ) % MOD;}while(q--){scanf("%d%d",&x,&y);printf("%d\n",(a[y] - a[x-1] + MOD)% MOD );}return 0;
}