• POJ3468 A Simple Problem with Integers


    Description

    给出了一个序列,你需要处理如下两种询问。

    "C abc"表示给[a, b]区间中的值全部增加c (-10000  c  10000)

    "Q ab" 询问[a, b]区间中所有值的和。

    Input

    第一行包含两个整数N, Q。1 N,Q  100000.

    第二行包含n个整数,表示初始的序列A (-1000000000  Ai 1000000000)。

    接下来Q行询问,格式如题目描述。

    Output

    对于每一个Q开头的询问,你需要输出相应的答案,每个答案一行。

    Sample Input

    10 5
    1 2 3 4 5 6 7 8 9 10
    Q 4 4
    Q 1 10
    Q 2 4
    C 3 6 3
    Q 2 4

    Sample Output

    4
    55
    9
    15


    依旧是线段树操作,注意数据范围用long long

     1 //#include<bits/stdc++.h>//POJ不吃这条
     2 #include<iostream>
     3 #include<cstdio>
     4 #include<cmath>
     5 #include<cstring>
     6 #include<algorithm>
     7 using namespace std;
     8 struct NODE{
     9     int l,r;
    10     long long sum,t;
    11 }node[1500000];
    12 int data[500000];
    13 int n,m;
    14 void Build(int num,int left,int right){//以num为根建线段树 
    15     node[num].l=left;
    16     node[num].r=right;
    17     if(left==right){
    18         node[num].sum=data[left];
    19         return;
    20     }
    21     int mid=(left+right)/2;
    22     Build(num*2,left,mid);
    23     Build(num*2+1,mid+1,right);
    24     node[num].sum=node[num*2].sum+node[num*2+1].sum;
    25     return;
    26 }
    27 
    28 void update(int num){//标记下传
    29     node[num<<1].t+=node[num].t;
    30     node[num*2+1].t+=node[num].t;
    31     node[num<<1].sum+=(node[num<<1].r-node[num<<1].l+1)*node[num].t;
    32     node[num*2+1].sum+=(node[num*2+1].r-node[num*2+1].l+1)*node[num].t;
    33     node[num].t=0;
    34     return;
    35 }
    36 long long qu(int l,int r,int num){//求和 
    37     if(node[num].r<l || node[num].l>r)return 0;
    38     if(node[num].l>=l && node[num].r<=r)return node[num].sum;
    39     if(node[num].t)update(num);
    40     return qu(l,r,num<<1)+qu(l,r,num*2+1);
    41 }
    42 void change(int l,int r,int c,int num){
    43     if(node[num].r<l || node[num].l>r)return;
    44     if(node[num].l>=l && node[num].r<=r){
    45         node[num].sum+=c*(node[num].r-node[num].l+1);
    46         node[num].t+=c;
    47         return;
    48     }
    49     if(node[num].t)update(num);
    50     change(l,r,c,num<<1);
    51     change(l,r,c,num*2+1);
    52     node[num].sum=node[num<<1].sum+node[num*2+1].sum;
    53     return;
    54 }
    55 int main(){
    56     scanf("%d%d",&n,&m);
    57     int i,j;
    58     for(i=1;i<=n;i++)scanf("%d",&data[i]);
    59     Build(1,1,n);
    60     char s;
    61     int a,b,c;
    62     for(i=1;i<=m;i++)
    63     {
    64         cin>>s;
    65         if(s=='C'){
    66             scanf("%d%d%d",&a,&b,&c);
    67             change(a,b,c,1);
    68         }
    69         if(s=='Q'){
    70             scanf("%d%d",&a,&b);
    71             printf("%lld
    ",qu(a,b,1));
    72         }
    73     }
    74     return 0;
    75 }


    因为printf里忘了用lld而WA,纠结了半个多小时才意识到问题所在←又犯了这种蠢错误

    本文为博主原创文章,转载请注明出处。
  • 相关阅读:
    混合现实开发教程unity2017
    Intro to Airplane Physics in Unity 3D – 2017 and 2018
    Unity Awards 2018最佳资源
    ambiguous
    Unity2018.3全新Prefab预制件系统深入介绍视频教程+PPT+Demo源码
    Android Studio 集成开发工具教学视频 + 项目实战安卓多SDK接入与集成
    Unity下一轮最大的变革-Entity Component System & C# Jobs System
    使用unity开发游戏时如觉得游戏声音太吵,点Mute Audio
    SQL Delta实用案例介绍
    经典批处理实现自动关机(BAT)
  • 原文地址:https://www.cnblogs.com/SilverNebula/p/5550604.html
Copyright © 2020-2023  润新知