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