士兵杀敌(五)

士兵杀敌(五)

时间限制: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 }

 

 

posted @ 2015-10-20 16:03  handsomecui  阅读(521)  评论(0编辑  收藏  举报