• nyoj 228士兵杀敌(五)




    士兵杀敌(五)

    时间限制:2000 ms  |  内存限制:65535 KB 


    难度:5

    描述 
    南将军麾下有百万精兵,现已知共有M个士兵,编号为0~M,每次有任务的时候,总会有一批编号连在一起人请战(编号相近的人经常在一块,相互之间比较熟悉),最终他们获得的军功,也将会平分到每个人身上,这样,有时候,计算他们中的哪一个人到底有多少军功就是一个比较困难的事情。

    在这样的情况下,南将军却经常会在许多次战役之后询问军师小工第i号士兵到第j号士兵所有人的总军功数。

    请你帮助军师小工回答南将军的提问。
    输入只有一组测试数据
     第一行是三个整数N,C,Q(1<=N,C,Q<=1000000),其中N表示士兵的总数。
     随后的C行,每行有三个整数Mi,Ni,Ai(0<=Mi<=Ni<=N,0<=Ai<=100),表示从第Mi号到第Ni号士兵所有人平均增加了Ai的军功。

     再之后的Q行,每行有两个正正数m,n,表示南将军询问的是第m号士兵到第n号士兵。输出请对每次询问输出m号士兵到第n号士兵的总军功数,由于该数值可能太大,请把结果对10003取余后输出

    样例输入

    5 3 2

    1 3 2
    2 4 1
    5 5 10
    1 5
    2 3


    样例输出

    19

    6

    //不是线段树也不是树状数组。是和树状数组相似的思想。

    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #include<iostream>
    using namespace std;
    int c[1000003];
    int main()
    {
        int a,b,n;
        //memset(c,0,sizeof(c));
        scanf("%d%d%d",&n,&a,&b);
        while(a--)
        {
            int a1,a2,b1;
            scanf("%d%d%d",&a1,&a2,&b1);
            //update(a1,b1);
           // update(a2+1,-b1);
            c[a1]+=b1;
            c[a2+1]-=b1;
        }
        for(int i=1; i<=n; i++)
        {
            c[i]+=c[i-1];
        }
        for(int i=1; i<=n; i++)
        {
            c[i]=(c[i]+c[i-1])%10003;
        }
        while(b--)
        {
            int y,z;
            scanf("%d%d",&y,&z);//
            printf("%d
    ",(c[z]-c[y-1]+10003)%10003);
        }
    }        
    




  • 相关阅读:
    微信小程序之相对位置
    SQL中 in 、not in 、exists、not exists 用法和差别
    指令打印程序(通过Socket)
    javaee正则表达式基础和常用表达式
    分析JSON/XML
    Hello2 source analisis(代码分析)
    Analysis Of HTTP
    Servlet Filter详细讲
    Analysis of Web.xml in Hello1 project
    Java annotation (注解)
  • 原文地址:https://www.cnblogs.com/da-mei/p/9053339.html
Copyright © 2020-2023  润新知