nyoj 228 士兵杀敌(五)

题目: 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("\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;
}

 

posted @ 2013-08-24 19:22  heity  阅读(158)  评论(0编辑  收藏  举报