zoukankan      html  css  js  c++  java
  • 士兵杀敌(五)

    士兵杀敌(五)

    时间限制: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
    ",(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
    ",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
    ",ans);
    85     }
    86     return 0;
    87 }
  • 相关阅读:
    数组排序与二维数组
    函数-头文件//Calculator.h
    [hiho1586]Minimum
    后缀数组模板整理
    [spoj694&spoj705]New Distinct Substrings(后缀数组)
    [poj3261]Milk Patterns(后缀数组)
    [poj3450]Corporate Identity(后缀数组)
    [poj1236]Network of Schools(targin缩点SCC)
    [hdu2087]剪花布条(KMP)
    [hdu2594]Simpsons’ Hidden Talents
  • 原文地址:https://www.cnblogs.com/handsomecui/p/4895116.html
Copyright © 2011-2022 走看看