zoukankan      html  css  js  c++  java
  • hdu-1754 I Hate It---线段树模板题

    题目链接:

    http://acm.hdu.edu.cn/showproblem.php?pid=1754

    题目大意:

    求区间最大值+单点修改

    解题思路:

    直接套用模板即可

     1 #include<bits/stdc++.h>
     2 #define MID(l, r) (l + (r - l) / 2)
     3 #define lson(o) (o * 2)
     4 #define rson(o) (o * 2 + 1)
     5 using namespace std;
     6 typedef long long ll;
     7 const int INF = 1e9 +7;
     8 const int maxn = 1e6 + 10;
     9 int a[maxn];
    10 struct node
    11 {
    12     int l, r, mmax, mmin, sum;
    13 }tree[maxn];
    14 void build(int o, int l, int r)
    15 {
    16     tree[o].l = l, tree[o].r = r;
    17     if(l == r)
    18     {
    19         tree[o].mmax = tree[o].mmin = tree[o].sum = a[l];
    20         return;
    21     }
    22     int m = MID(l, r);
    23     int lc = lson(o), rc = rson(o);
    24     build(lc, l, m);
    25     build(rc, m + 1, r);
    26     tree[o].mmax = max(tree[lc].mmax, tree[rc].mmax);
    27     tree[o].mmin = min(tree[lc].mmin, tree[rc].mmin);
    28     tree[o].sum = tree[lc].sum + tree[rc].sum;
    29 }
    30 int ql, qr;//查询区间[ql, qr]中的max,min,sum
    31 int ans_max, ans_min, ans_sum;
    32 void query_init()//查询前,将全局变量初始化
    33 {
    34     ans_max = -INF;
    35     ans_min = INF;
    36     ans_sum = 0;
    37 }
    38 void query(int o)
    39 {
    40     if(ql <= tree[o].l && qr >= tree[o].r)//[L, R]包含在[ql, qr]区间内,直接用该节点的信息,达到线段树查询快的操作
    41     {
    42         ans_max = max(ans_max, tree[o].mmax);
    43         ans_min = min(ans_min, tree[o].mmin);
    44         ans_sum += tree[o].sum;
    45         return;
    46     }
    47     int m = MID(tree[o].l, tree[o].r);
    48     if(ql <= m)query(lson(o));
    49     if(qr > m)query(rson(o));
    50 }
    51 //单点更新,a[p] = v;
    52 int p, v;
    53 void update(int o)
    54 {
    55     if(tree[o].l == tree[o].r)
    56     {
    57         tree[o].mmax = v;
    58         tree[o].mmin = v;
    59         tree[o].sum = v;
    60         return;
    61     }
    62     int m = MID(tree[o].l, tree[o].r);
    63     int lc = lson(o), rc = rson(o);
    64     if(p <= m)update(lc);
    65     else update(rc);
    66     tree[o].mmax = max(tree[lc].mmax, tree[rc].mmax);
    67     tree[o].mmin = min(tree[lc].mmin, tree[rc].mmin);
    68     tree[o].sum = tree[lc].sum + tree[rc].sum;
    69 }
    70 int main()
    71 {
    72     int n, m;
    73     while(scanf("%d%d", &n, &m) != EOF)
    74     {
    75         for(int i = 1; i <= n; i++)scanf("%d", &a[i]);
    76         build(1, 1, n);
    77         char s[5];
    78         int x, y;
    79         while(m--)
    80         {
    81             scanf("%s%d%d", s, &x, &y);
    82             if(s[0] == 'Q')
    83             {
    84                 ql = x, qr = y;
    85                 query_init();
    86                 query(1);
    87                 printf("%d
    ", ans_max);
    88             }
    89             else if(s[0] == 'U')
    90             {
    91                 p = x, v = y;
    92                 update(1);
    93             }
    94         }
    95     }
    96     return 0;
    97 }
  • 相关阅读:
    格式化字符串漏洞利用实战之 0ctf-easyprintf
    java多线程机制中的Thread和Runnable()区别
    Eclipse中部署Android开发环境插件安装问题方案
    java接口实现
    Visual Studio UML
    java子类继承关系
    Visual Studio UML类图
    java方法重载和重写
    javaSocket笔记
    python网络爬虫笔记(九)
  • 原文地址:https://www.cnblogs.com/fzl194/p/9025005.html
Copyright © 2011-2022 走看看