士兵杀敌(五)
士兵杀敌(五)
时间限制: 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#include #include int num[1000005];int main() {int n, m, k, s, e, val, i;scanf("%d%d%d", &n, &m, &k);memset(num, 0, sizeof(num));for(i = 0; i < m; i++){scanf("%d%d%d", &s, &e, &val);num[s] += val; //起始和结尾的下一个点做下处理num[e+1] -= val;}for(i = 1; i <= n; i++){num[i] += num[i-1]; //加一遍可以得到每个士兵电的杀敌数}for(i = 1; i <= n; i++){num[i] = (num[i-1]+num[i])%10003; //更新数组, num[i] 表示1~i总杀敌数}for(i = 0; i < k; i++){scanf("%d%d", &s, &e);printf("%d\n", (num[e]-num[s-1]+10003)%10003); //区间查询}return 0; }
- 只有一组测试数据
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
