zoukankan      html  css  js  c++  java
  • HDU_1754 I Hate It (线段树)

      线段树题目,每一段存这一段的最大值。查询时直接匹配线段,找出最大值就行,更新有点小操作要注意。

    结构体

    struct node
    {
    int l, r;
    int max;
    }node[N
    *4];

    两数取较大的:

    int Max(int a, int b)
    {
    return a > b ? a : b;
    }

    建树

    void creat(int t, int l, int r)
    {
    node[t].l
    = l;
    node[t].r
    = r;
    if(l == r)
    {
    node[t].max
    = stu[l];   //用一个stu[]存储N个学生的初始成绩, 方便在建树时使用
    return ;
    }
    int mid = (r + l) >> 1;
    creat(t
    << 1, l, mid);
    creat(t
    << 1|1, mid + 1, r);
    node[t].max
    = Max(node[t<<1].max, node[t<<1|1].max);
    }

    更新:

    void updata(int t, int x, int y)
    {
    if(node[t].l ==x && x == node[t].r)
    {
    node[t].max
    = y;
    return ;
    }
    int mid = (node[t].l + node[t].r) >> 1;
    if(x <= mid)
    updata(t
    << 1, x, y);
    else
    updata(t
    << 1|1, x, y);
    node[t].max
    = Max(node[t<<1].max, node[t<<1|1].max);

    }

    查询:

    void query(int t, int l, int r)
    {
    if(node[t].l == l && node[t].r == r)
    {
    if(ans <= node[t].max)
    ans
    = node[t].max;
    return;
    }
    int mid = (node[t].l + node[t].r) >> 1;
    if(l > mid)
    query(t
    <<1|1, l, r);
    else if(r <= mid)
    query(t
    <<1, l, r);
    else
    {
    query(t
    <<1, l, mid);
    query(t
    <<1|1, mid+1, r);
    }
    }

    另外一种写法,今天复习线段树重新做了一遍这题,正值中午十分,昏昏欲睡,迷迷糊糊的写这了这段代码。。。

    #include <iostream>
    #include
    <cstdio>
    #include
    <cstring>
    #define L(t) t<<1
    #define R(t) t<<1|1

    using namespace std;

    const int N = 200005;

    struct node
    {
    int l, r;
    int max;
    }node[N
    *3];

    int num[N];

    int Max(int a, int b)
    {
    return a > b ? a : b;
    }
    void creat(int t, int l, int r)
    {
    node[t].l
    = l;
    node[t].r
    = r;
    if(l == r)
    {
    node[t].max
    = num[l];
    return;
    }
    int mid = (l + r) >> 1;
    creat(L(t), l, mid);
    creat(R(t), mid
    +1, r);
    node[t].max
    = Max(node[L(t)].max, node[R(t)].max);
    }

    void updata(int t, int x, int val)
    {
    node[t].max
    = Max(node[t].max, val);

    if(node[t].l == x && node[t].r == x)
    {
    node[t].max
    = val;
    return ;
    }
    int mid = (node[t].l + node[t].r) >> 1;
    if(x <= mid)
    updata(L(t), x, val);
    else
    updata(R(t), x, val);
    }

    int query(int t, int l, int r)
    {
    if(node[t].l == l && node[t].r == r)
    return node[t].max;
    int mid = (node[t].l + node[t].r) >> 1;
    if(l > mid)
    return query(R(t), l, r);
    else if(r <= mid)
    return query(L(t), l, r);
    else
    return Max(query(L(t), l, mid), query(R(t), mid+1, r));
    }

    int main()
    {
    //freopen("data.in", "r", stdin);

    int n, m, i, x, y;
    char s[2];
    while(~scanf("%d%d", &n, &m))
    {
    for(i = 1; i <= n; i++)
    scanf(
    "%d", &num[i]);
    creat(
    1, 1, n);
    while(m--)
    {
    scanf(
    "%s%d%d", s, &x, &y);
    if(s[0] == 'U')
    updata(
    1, x, y);
    else
    printf(
    "%d\n", query(1, x, y));
    }
    }
    return 0;
    }

  • 相关阅读:
    同一根域名的多站点登录共享
    mysql忘记管理员密码
    使用Cacti监控你的网络(四) Cacti脚本及模板
    使用Cacti时常见的问题集
    SQL Server:SQL Like 通配符特殊用法:Escape
    IS6.0 应用程序池Web园导致Session丢失
    VMware建立虚拟机无法上网
    SqlServer 添加用户 添加角色 分配权限
    教你如何在SQL Server数据库中加密数据
    sendmail邮件服务器搭载smtp和pop3认证的配置方法
  • 原文地址:https://www.cnblogs.com/vongang/p/2137952.html
Copyright © 2011-2022 走看看