zoukankan      html  css  js  c++  java
  • HDU 1754 I Hate It (线段树 单点更新)

    题目链接

    中文题意,与上题类似。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <queue>
     5 #include <cstdlib>
     6 #include <algorithm>
     7 const int maxn = 200000+10;
     8 using namespace std;
     9 int a[maxn], n, m;
    10 struct line
    11 {
    12     int l, r, val;  //val代表该区间的最大值
    13 }tr[4*maxn];
    14 
    15 void build(int o, int l, int r)
    16 {
    17     tr[o].l = l; tr[o].r = r;
    18     if(l==r)
    19     {
    20         tr[o].val = a[l];
    21         return;
    22     }
    23     int mid = (l+r)/2;
    24     build(2*o, l, mid);
    25     build(2*o+1, mid+1, r);
    26     tr[o].val = max(tr[2*o].val, tr[2*o+1].val);
    27 }
    28 int query(int o, int l, int r)
    29 {
    30     if(tr[o].l==l && tr[o].r==r)
    31         return tr[o].val;
    32     int mid = (tr[o].l+tr[o].r)/2;
    33     if(r<=mid) query(2*o, l, r);  //这里一定记住只要不跨区间就是l,r。因为这个错了几次
    34     else if(l > mid) query(2*o+1, l, r);
    35     else
    36     {
    37         return max(query(2*o, l, mid), query(2*o+1, mid+1, r));
    38     }
    39 }
    40 void update(int o, int p, int v)
    41 {
    42     if(tr[o].l==tr[o].r && tr[o].l==p)
    43     {
    44         tr[o].val = v;
    45         return;
    46     }
    47     int mid = (tr[o].l + tr[o].r)/2;
    48     if(p<=mid) update(2*o, p, v);
    49     else update(2*o+1, p, v);
    50     tr[o].val = max(tr[2*o].val, tr[2*o+1].val);
    51 }
    52 int main()
    53 {
    54     char ch;
    55     int i, l, r;
    56     while(~scanf("%d%d", &n, &m))
    57     {
    58         for(i = 1; i <= n; i++)
    59         scanf("%d", &a[i]);
    60         build(1, 1, n);
    61 
    62         for(i = 0; i < m; i++)
    63         {
    64             getchar();
    65             scanf("%c%d%d", &ch, &l, &r);
    66             if(ch=='Q')
    67                printf("%d
    ", query(1, l, r));
    68             else
    69                update(1, l, r);
    70         }
    71     }
    72     return 0;
    73 }
  • 相关阅读:
    Oracle10g服务启动命令
    Linux系统添加永久静态路由的方法
    搭建YUM仓库与定制RPM包
    LVS简介
    【Linux】先添加一块磁盘制作LVM卷并进行分区挂载
    函数部分
    Python中if __name__ == "__main__": 的作用 (整理转自Arkenstone) --感谢!
    python语言基础笔记
    部分示例程序
    转,关于游标
  • 原文地址:https://www.cnblogs.com/bfshm/p/3890951.html
Copyright © 2011-2022 走看看