zoukankan      html  css  js  c++  java
  • nyoj228 士兵杀敌(5)插线问线

     

    士兵杀敌(五)

    时间限制: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
    
    士兵杀敌系列的又一个经典的题目,采用之前的加上之后的减去的算法,以达到节省时间和空间的目的;
    代码如下:
     1 #include<stdio.h>
     2 #include<string.h>
     3 int num[1000010]={0};
     4 int main()
     5 {
     6  int n,c,q,f,t,v,i,x,y,value;
     7  scanf("%d%d%d",&n,&c,&q);
     8  while(c--)
     9  {
    10   scanf("%d%d%d",&f,&t,&v);
    11   num[f]+=v;
    12   num[t+1]-=v;
    13  }
    14 
    15  value=0;
    16  for(i=0;i<=n+1;++i)
    17  {
    18   value+=num[i];
    19   num[i]=(value+num[i-1])%10003;
    20  }
    21  while(q--)
    22  {
    23   scanf("%d%d",&x,&y);
    24   printf("%d
    ",(num[y]-num[x-1]+10003)%10003);
    25  }
    26  return 0;
    27 }
  • 相关阅读:
    第36课 经典问题解析三
    第35课 函数对象分析
    67. Add Binary
    66. Plus One
    58. Length of Last Word
    53. Maximum Subarray
    38. Count and Say
    35. Search Insert Position
    28. Implement strStr()
    27. Remove Element
  • 原文地址:https://www.cnblogs.com/lovychen/p/3376650.html
Copyright © 2011-2022 走看看