连接:http://acm.nyist.net/JudgeOnline/problem.php?pid=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号士兵。
5 3 2 1 3 2 2 4 1 5 5 10 1 5 2 3
19 6
#include<stdio.h> int bing[1000010]; int MAX; void add(int a,int b,int c) { int n; n=a-1; while(n>0) { bing[n]-=c; n-=(n&(-n)); } n=b; while(n>0) { bing[n]+=c; n-=(n&(-n)); } } int chazhao(int a,int b) { int totle=0,i,n,term; for(i=a;i<=b;i++) { n=0;term=i; while(term<MAX) { n+=bing[term]; term+=(term&(-term)); } totle+=n; } return(totle); } int main() { int cc,q; int a,b,c; scanf("%d%d%d",&MAX,&cc,&q); while(cc--) { scanf("%d%d%d",&a,&b,&c); add(a,b,c); } while(q--) { scanf("%d%d",&a,&b); printf("%d\n",chazhao(a,b)%10003); } return(0); }
#include<stdio.h> struct Bing { int l; int r; int date; }bing[3*1000000]; void build(int a,int b,int n=1) { bing[n].l=a; bing[n].r=b; bing[n].date=0; if(a==b)return; int zhong=(a+b)>>1; build(a,zhong,2*n); build(zhong+1,b,2*n+1); } void add(int a,int b,int c,int n=1) { int zhong; if(bing[n].l==a&&bing[n].r==b) { bing[n].date+=c; return; } else { zhong=(bing[n].l+bing[n].r)>>1; if(b<=zhong)add(a,b,c,2*n); else if(a>zhong)add(a,b,c,2*n+1); else { add(a,zhong,c,2*n); add(zhong+1,b,c,2*n+1); } } } void find(int a,int b,int &c,int n=1) { if(n==1)c=0; c+=bing[n].date*(b-a+1); if(bing[n].l==bing[n].r)return; int zhong=(bing[n].l+bing[n].r)>>1; if(b<=zhong)find(a,b,c,2*n); else if(a>zhong)find(a,b,c,2*n+1); else { find(a,zhong,c,2*n); find(zhong+1,b,c,2*n+1); } } int main() { int aa,bb,cc; int n,c,q; scanf("%d%d%d",&n,&c,&q); build(1,n+1,1); while(c--) { scanf("%d%d%d",&aa,&bb,&cc); add(aa+1,bb+1,cc); } while(q--) { scanf("%d%d",&aa,&bb); find(aa+1,bb+1,cc); printf("%d\n",cc%10003); } return(0); }
#include<stdio.h> int p[1000010]; int main() { int n,c,q; int a,b,cc; int i; scanf("%d%d%d",&n,&c,&q); while(c--) { scanf("%d%d%d",&a,&b,&cc); p[a]+=cc; p[b+1]-=cc; } for(i=1;i<=n;i++) p[i]+=p[i-1]; for(i=1;i<=n;i++) p[i]=(p[i-1]+p[i])%10003; while(q--) { scanf("%d%d",&a,&b); printf("%d\n",(p[b]-p[a-1]+10003)%10003); } return(0); }
相关推荐
线段树 树状数组 数据结构 线段树 树状数组 数据结构 acm 线段树 树状数组 数据结构 线段树 树状数组 数据结构 acm 线段树 树状数组 数据结构 线段树 树状数组 数据结构 acm 线段树 树状数组 数据结构 线段树 树状...
线段树 树状数组 首先讲解了线段树,然后讲解树状数组,最后比较了树状数组和线段树的用法。
线段树和树状数组acm中很重要的数据结构,本文深入浅出地讲解了线段树树状数组的原理和应用
线段树&树状数组课件 树状数组&线段树是最基本的高级数据结构之二 一般出现于较难题中 应用广泛,可用于直接写正解/把暴力改进成正解/拿大量部分分
ACM数据结构之树状数组和线段树 ACM数据结构之树状数组和线段树 ACM数据结构之树状数组和线段树
线段树,树状数组课件讲解。线段树,树状数组课件讲解。
详细的数据结构延伸介绍(包括AC自动机SBT,伸展树,字典树,并查集,笛卡尔树,二叉堆,斐波那契堆,哈希表,红黑树,后缀树,后缀数组,树状数组,线段树,左偏树,斜堆),自己整理和归纳相当长的时间,里面有网上的资料,牛人的...
树状数组 树状数组 树状数组 树状数组树状数组 树状数组 树状数组 树状数组树状数组 树状数组 树状数组 树状数组
线段树与树状数组的数据结构、算法、例题,非常详细和有条理
并查集、树状数组、线段数三种高级数据结构的PPT,以及一些论文
线段树和树状数组
这是一道很不错的题目,即可以用线段树做也可以用树状数组,可谓经典。不过当然了线段树是比较难搞,而树状数组是极其简洁的,构造很简单,下面就分别来介绍一下两种方法...
树状数组 后缀数组 字典树 多串匹配算法及启示
树状数组 树状数组.ppt
acm的关于线段树解决区间问题的算法模型讲解 线段树与树状数组 在acm竞赛中 常常被引用以缩短时间增加程序效率。
含义其实就是用一个数组,构成树形结构来维护原数组的前缀和。 显然,对于树状数组C,C[I]对应“管辖”多少个元素,与它对应二进制数最右端第一个1的位置有关。这样,就能够达到询问一个区间的值,或者改变值的时间...
本文详细介绍了树状数组的原理,并用树状数组解校门外的树这个问题.
洛谷上关于树状数组的一些简单例题,可参考学习,适合初学者
线段树与树状数组 ACM课件,通过这个课件你可以学到很多,里面也有代码示例
树状数组详解