nyoj 228 士兵杀敌(五)

士兵军功计算与延迟更新算法详解
本文详细解析了一道ACM问题中涉及的士兵军功计算与延迟更新算法,通过数组操作实现高效更新与求和过程。特别注意士兵编号从0开始,不同于常规的1开始情况。

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

 

转载于:https://www.cnblogs.com/yyroom/p/3279648.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值