I Hate It - HDU 1754 线段树

140 篇文章 0 订阅

I Hate It - HDU 1754 线段树

  国际惯例中文题目不需要解释题意。

  思路:也是个水体,直接裸线段树就可以,没有什么需要注意的地方。写的时候有一个小错误就是刚开始我在本地运行的时候发现Q 1 5一直是零,结果发现是build函数没有写到main里去。

AC代码:

//
//  main.cpp
//  L
//
//  Created by LucienShui on 2017/5/24.
//  Copyright © 2017年 LucienShui. All rights reserved.
//

#include <iostream>
#include <algorithm>
#include <set>
#include <string>
#include <vector>
#include <queue>
#include <map>
#include <iomanip>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cctype>
#define memset(a,b) memset(a,b,sizeof(a))
#define il inline
#define ull unsigned long long

using namespace std;

const int MAXN=200005;
int node[MAXN<<2],a[MAXN];

#define ls (u<<1)
#define rs (u<<1|1)

il void build(int u, int left, int right);
il void update(int u, int left, int right, int ai, int num);
il int query(int u, int left, int right, int begin, int end);
il void read(int n);
il void solve(int n, int m);

int main ()
{
#ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
#endif // ONLINE_JUDGE
    int n,m;
    while(~scanf("%d%d",&n,&m)) {
        read(n);
        build(1,1,n);
        solve(n,m);
    }
    return 0;
}

il void build(int u, int left, int right) {
    if(left == right) node[u] = a[left];
    else {
        int mid = (left + right) >> 1;
        build(ls, left, mid);
        build(rs, mid+1, right);
        node[u] = max(node[ls],node[rs]);
    }
}
il void update(int u, int left, int right, int ai, int num) {
    if(left == right) {
        node[u] = num;
        return ;
    }
    int mid = (left + right) >> 1;
    if(ai<=mid) update(ls,left,mid,ai,num);
    else update(rs,mid+1,right,ai,num);
    node[u] = max(node[ls],node[rs]);
}
il int query(int u, int left, int right, int begin, int end) {
    if(begin <= left && right <= end) return node[u];
    int mid = (left + right) >> 1;
    if(end <= mid) return query(ls, left, mid, begin, end);
    else if(begin > mid) return query(rs, mid+1, right, begin, end);
    else return max(query(ls, left, mid, begin, end),query(rs, mid+1, right, begin, end));
}
il void read(int n) {
    for(int i=1 ; i<=n ; i++) scanf("%d",a+i);
}
il void solve(int n, int m) {
    char c;
    int a,b;
    while(m--) {
        scanf(" %c%d%d",&c,&a,&b);
        if(c=='Q') printf("%d\n",query(1,1,n,a,b));
        else update(1,1,n,a,b);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值