• [POJ3468]A Simple Problem with Integers


    题目链接:http://poj.org/problem?id=3468

    线段树区间更新查询的样题,注意数据范围。连要更新的数据也必须是long long。

     1 #include <algorithm>
     2 #include <iostream>
     3 #include <iomanip>
     4 #include <cstring>
     5 #include <climits>
     6 #include <complex>
     7 #include <cassert>
     8 #include <cstdio>
     9 #include <bitset>
    10 #include <vector>
    11 #include <deque>
    12 #include <queue>
    13 #include <stack>
    14 #include <ctime>
    15 #include <set>
    16 #include <map>
    17 #include <cmath>
    18 using namespace std;
    19 
    20 typedef long long LL;
    21 #define lrt rt << 1
    22 #define rrt rt << 1 | 1
    23 const int maxn = 100100;
    24 LL sum[maxn<<2], add[maxn<<2];
    25 int n, q;
    26 char cmd[2];
    27 
    28 void pushUP(int rt) {
    29     sum[rt] = sum[lrt] + sum[rrt];
    30 }
    31 
    32 void pushDOWN(int rt, int len) {
    33     if(add[rt]) {
    34         sum[lrt] += (len - len / 2) * add[rt];
    35         sum[rrt] += len / 2 * add[rt];
    36         add[lrt] += add[rt];
    37         add[rrt] += add[rt];
    38         add[rt] = 0;
    39     }
    40 }
    41 
    42 void build(int l, int r, int rt) {
    43     add[rt] = 0;
    44     if(l == r) {
    45         scanf("%I64d", &sum[rt]);
    46         return;
    47     }
    48     int mid = (l + r) >> 1;
    49     build(l, mid, lrt);
    50     build(mid+1, r, rrt);
    51     pushUP(rt);
    52 }
    53 
    54 void update(int L, int R, LL c, int l, int r, int rt) {
    55     if(L <= l && r <= R) {
    56         add[rt] += c;
    57         sum[rt] += (LL)c * (r - l + 1);
    58         return;
    59     }
    60     pushDOWN(rt, r-l+1);
    61     int mid = (l + r) >> 1;
    62     if(L <= mid) update(L, R, c, l, mid, lrt);
    63     if(mid < R) update(L, R, c, mid+1, r, rrt);
    64     pushUP(rt);
    65 }
    66 
    67 LL query(int L, int R, int l, int r, int rt) {
    68     if(L <= l && r <= R) return sum[rt];
    69     pushDOWN(rt, r-l+1);
    70     int mid = (l + r) >> 1;
    71     LL ret = 0;
    72     if(L <= mid) ret += query(L, R, l, mid, lrt);
    73     if(mid < R) ret += query(L, R, mid+1, r, rrt);
    74     return ret;
    75 }
    76 
    77 int main() {
    78     // freopen("in", "r", stdin);
    79     int l, r, c;
    80     while(~scanf("%d%d",&n,&q)) {
    81         build(1, n, 1);
    82         while(q--) {
    83             scanf("%s", cmd);
    84             if(cmd[0] == 'Q') {
    85                 scanf("%d%d",&l,&r);
    86                 printf("%I64d
    ", query(l,r,1,n,1));
    87             }
    88             else {
    89                 scanf("%d%d%d",&l,&r,&c);
    90                 update(l,r,LL(c),1,n,1);
    91             }
    92         }
    93     }
    94     return 0;
    95 }
  • 相关阅读:
    x01.JavaHello
    x01.Weiqi.1 提子算法
    x01.Weiqi.3 网络对弈
    Cryptography
    Javascript判断中文字节
    asp.net mvc,asp.net4.0空间出售
    Sql Server中判断日志是否为一个星期
    DIV+CSS实现二级导航菜单
    ExecutorService线程池 [转]
    Android程序开发所用app图标的几种大小
  • 原文地址:https://www.cnblogs.com/kirai/p/4771834.html
Copyright © 2020-2023  润新知