士兵杀敌(五)
士兵杀敌(五)
时间限制: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
线段树写一直出错。。。
结果看别人用数组写的;
ac代码1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<iostream> 5 using namespace std; 6 const int INF=0x3f3f3f3f; 7 //#define LOCAL 8 const int MAXN=1000010; 9 const int MOD=10003; 10 int m[MAXN]; 11 int main(){ 12 #ifdef LOCAL 13 freopen("data.in","r",stdin); 14 freopen("data.out","w",stdout); 15 #endif 16 int N,C,Q; 17 scanf("%d%d%d",&N,&C,&Q); 18 memset(m,0,sizeof(m)); 19 int a,b,c; 20 while(C--){ 21 scanf("%d%d%d",&a,&b,&c); 22 m[a]+=c;m[b+1]-=c; 23 } 24 for(int i=1;i<=N;i++)m[i]+=m[i-1]; 25 for(int i=1;i<=N;i++)m[i]=(m[i]+m[i-1])%MOD; 26 while(Q--){ 27 scanf("%d%d",&a,&b); 28 printf("%d\n",(m[b]-m[a-1]+MOD)%MOD); 29 } 30 return 0; 31 }
线段树超时:
1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 #include<algorithm> 5 using namespace std; 6 //#define LOCAL 7 const int INF=0x3f3f3f3f; 8 const int MAXN=1000000; 9 #define L tree[root].l 10 #define R tree[root].r 11 #define V tree[root].val 12 #define S tree[root].sum 13 #define LA tree[root].lazy 14 #define NOW tree[root].sum=(tree[root<<1].sum+tree[root<<1|1].sum)%10003 15 #define lson root<<1,l,mid 16 #define rson root<<1|1,mid+1,r 17 struct Node{ 18 int l,r,val,lazy,sum; 19 }; 20 Node tree[MAXN*3]; 21 int ans; 22 void build(int root,int l,int r){ 23 L=l;R=r; 24 LA=0; 25 V=0; 26 S=0; 27 if(l==r)return; 28 else{ 29 int mid=(l+r)>>1; 30 build(lson); 31 build(rson); 32 } 33 } 34 void update(int root,int l,int r,int v){ 35 if(L==l&&R==r){ 36 LA=1; 37 V=v; 38 S+=v*(r-l+1)%10003; 39 } 40 else{ 41 int mid=(L+R)>>1; 42 if(LA){ 43 LA=0; 44 update(root<<1,L,mid,V); 45 update(root<<1|1,mid+1,R,V); 46 V=0; 47 } 48 if(mid>=r)update(root<<1,l,r,v);//lazy线段树这点十分重要 49 else if(mid<l)update(root<<1|1,l,r,v);// 50 else{ 51 update(lson,v);// 52 update(rson,v);// 53 } 54 NOW; 55 } 56 } 57 void query(int root,int l,int r){ 58 if(L>=l&&R<=r)ans=(ans+S)%10003; 59 else{ 60 int mid=(L+R)>>1; 61 if(mid>=l)query(root<<1,l,r); 62 if(mid<r)query(root<<1|1,l,r); 63 } 64 } 65 int main(){ 66 #ifdef LOCAL 67 freopen(data.in,"r",stdin); 68 freopen(data.out,"w",stdout); 69 #endif 70 int N,C,Q,a,b,c; 71 scanf("%d%d%d",&N,&C,&Q); 72 build(1,1,N+1); 73 while(C--){ 74 scanf("%d%d%d",&a,&b,&c); 75 a++;b++; 76 update(1,a,b,c); 77 // printf("%d\n",tree[1].sum); 78 } 79 while(Q--){ 80 scanf("%d%d",&a,&b); 81 a++;b++; 82 ans=0; 83 query(1,a,b); 84 printf("%d\n",ans); 85 } 86 return 0; 87 }