zoukankan      html  css  js  c++  java
  • poj 3468 A Simple Problem with Integers

    poj 3468 A Simple Problem with Integers

    题意:这道题是个标准的成段更新的线段树。

    View Code
     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 #include<iostream>
     4 #include<string>
     5 #include<queue>
     6 #include<map>
     7 #include<cmath>
     8 #include<stack>
     9 #include<algorithm>
    10 #include<functional>
    11 using namespace std;
    12 //1.bulid();
    13 //2.query(a,b)
    14 //3.update(a,b)
    15 #define lson l , m , rt << 1
    16 #define rson m + 1 , r , rt << 1 | 1
    17 typedef long long LL;
    18 const int maxn = 100055;
    19 LL sign[maxn<<2];
    20 LL sum[maxn<<2];
    21 int n;
    22 //根据题意做相关修改,询问时的操作 
    23 LL operate(LL a,LL b){
    24     return a+b;
    25 }
    26 void PushUp(int rt){
    27     sum[rt]=operate(sum[rt<<1],sum[rt<<1|1]);
    28 }
    29 void PushDown(int rt,int m) {
    30     if (sign[rt]) {
    31         sign[rt<<1]   += sign[rt];
    32         sign[rt<<1|1] += sign[rt];
    33         sum[rt<<1] += (m - (m >> 1)) * sign[rt];
    34         sum[rt<<1|1] += (m >> 1) * sign[rt];
    35         sign[rt] = 0;
    36     }
    37 }
    38 void bulid(int l=1,int r=n,int rt=1){
    39     sign[rt] = 0;
    40     if(l==r){// 据题意做相关修改
    41         scanf("%lld",&sum[rt]);return ;
    42     }
    43     int m=(l+r)>>1;
    44     bulid(lson);
    45     bulid(rson);
    46     PushUp(rt);
    47 }
    48 void update(int L,int R,int add,int l=1,int r=n,int rt=1){
    49     if(L<=l && r<=R){// 据题意做相关修改
    50         sign[rt]+=add;
    51             sum[rt]+=(LL)add*(r-l+1);return ;
    52     }
    53     PushDown(rt,r-l+1);
    54     int m = (l + r) >> 1;
    55     if (L <= m) update(L , R , add , lson);
    56     if (R > m) update(L , R , add , rson);
    57     PushUp(rt);
    58 }
    59 LL query(int L,int R,int l=1,int r=n,int rt=1) {
    60     if (L <= l && r <= R) {
    61         return sum[rt];
    62     }
    63     PushDown(rt , r - l + 1);
    64     int m = (l + r) >> 1;
    65     LL ret = 0;
    66     if (L <= m) ret += query(L , R , lson);
    67     if (m < R) ret += query(L , R , rson);
    68     return ret;
    69 }
    70 
    71 int main()
    72 {
    73     int m,x,y,z;
    74     char op[2];
    75     while(~scanf("%d%d",&n,&m)){
    76         bulid();
    77         while(m--){
    78             scanf("%s",op);
    79             if(op[0]=='Q'){
    80                 scanf("%d%d",&x,&y);
    81                 printf("%lld\n",query(x,y));
    82             }else{
    83                 scanf("%d%d%d",&x,&y,&z);
    84                 update(x,y,z);
    85             }
    86             
    87         }
    88     }
    89     
    90     return 0;
    91 }
  • 相关阅读:
    cmder 基本配置和使用
    apache开启.htaccess及.htaccess的使用方法
    PHP 伪静态规则写法RewriteRule-htaccess详细语法使用
    Oracle创建分区表
    Oracle基础知识
    SQLPLUS
    linux上使用docker安装oracle
    使用IDEA创建可执行jar
    Hyper-V-问题整理
    spring的容器管理
  • 原文地址:https://www.cnblogs.com/tiankonguse/p/2618568.html
Copyright © 2011-2022 走看看