zoukankan      html  css  js  c++  java
  • 【SPOJ】1043 Can you answer these queries III

    操作:

    1,更新某个位置的值。

    2,查询区间最大连续和。

    更新位置然后PushUp。

    查询同【SPOJ】1043 Can you answer these queries I

     1 #include<cstdio>
     2 #define MAX(a,b) ((a)>(b)?(a):(b))
     3 #define MAXN 50010
     4 #define oo 1000000000
     5 struct node {
     6     int left, right, sum, val;
     7     void Init() {
     8         sum = 0;
     9         left = right = val = -oo;
    10     }
    11 };
    12 node tree[MAXN << 2];
    13 inline void PushUp(int rt) {
    14     tree[rt].left = MAX(tree[rt << 1].left,
    15             tree[rt << 1].sum + tree[rt << 1 | 1].left);
    16     tree[rt].right = MAX(tree[rt << 1 | 1].right,
    17             tree[rt << 1 | 1].sum + tree[rt << 1].right);
    18     tree[rt].sum = tree[rt << 1].sum + tree[rt << 1 | 1].sum;
    19     tree[rt].val = MAX(tree[rt << 1].val, tree[rt << 1 | 1].val);
    20     tree[rt].val = MAX(tree[rt].val,
    21             tree[rt << 1].right + tree[rt << 1 | 1].left);
    22 }
    23 void Build(int L, int R, int rt) {
    24     if (L == R) {
    25         scanf("%d", &tree[rt].val);
    26         tree[rt].left = tree[rt].right = tree[rt].sum = tree[rt].val;
    27     } else {
    28         int mid = (L + R) >> 1;
    29         Build(L, mid, rt << 1);
    30         Build(mid + 1, R, rt << 1 | 1);
    31         PushUp(rt);
    32     }
    33 }
    34 void Update(int x, int val, int L, int R, int rt) {
    35     if (L == R)
    36         tree[rt].left = tree[rt].right = tree[rt].sum = tree[rt].val = val;
    37     else {
    38         int mid = (L + R) >> 1;
    39         if (x <= mid)
    40             Update(x, val, L, mid, rt << 1);
    41         else
    42             Update(x, val, mid + 1, R, rt << 1 | 1);
    43         PushUp(rt);
    44     }
    45 }
    46 node Query(int x, int y, int L, int R, int rt) {
    47     if (x <= L && R <= y)
    48         return tree[rt];
    49     int mid = (L + R) >> 1;
    50     node a, b, res;
    51     a.Init(), b.Init(), res.Init();
    52     if (x <= mid)
    53         a = Query(x, y, L, mid, rt << 1);
    54     if (y > mid)
    55         b = Query(x, y, mid + 1, R, rt << 1 | 1);
    56     res.left = MAX(a.left, a.sum + b.left);
    57     res.right = MAX(b.right, b.sum + a.right);
    58     res.sum = a.sum + b.sum;
    59     res.val = MAX(a.val, b.val);
    60     res.val = MAX(res.val, a.right + b.left);
    61     return res;
    62 }
    63 int main() {
    64     int n, q, cmd, x, y;
    65     while (~scanf("%d", &n)) {
    66         Build(1, n, 1);
    67         scanf("%d", &q);
    68         while (q--) {
    69             scanf("%d%d%d", &cmd, &x, &y);
    70             if (cmd)
    71                 printf("%d\n", Query(x, y, 1, n, 1).val);
    72             else
    73                 Update(x, y, 1, n, 1);
    74         }
    75     }
    76     return 0;
    77 }
  • 相关阅读:
    简练软考知识点整理-项目定义活动过程
    简练软考知识点整理-规划进度管理
    简练软考知识点整理-控制范围
    软考考前注意事项
    简练软考知识点整理-确认范围管理
    数据库之表关系
    数据库引擎
    数据库概念
    IO模型
    异步回调,线程队列,协程
  • 原文地址:https://www.cnblogs.com/DrunBee/p/2661098.html
Copyright © 2011-2022 走看看