[HihoCoder]#1077 : RMQ问题再临-线段树

来源:互联网 发布:交流软件英文怎么说 编辑:程序博客网 时间:2024/06/08 05:09

华电北风吹
天津大学认知计算与应用重点实验室
2016-07-26

题目链接:
http://hihocoder.com/problemset/problem/1077

题目分析:
模板题目,但是利用C++里面的输入输出流会有超时错误,修改为C语言的输入输出就没问题。

参考代码:

#include <stdio.h>#include <algorithm>using namespace std;#define INT_MAX 0x7fffffffstruct node{    int leftID, rightID;    int minVal;};node data[4000000 + 10];int father[1000000 + 2];void Build(int i, int left, int right){    int middle = (left + right) >> 1;    data[i].leftID = left;    data[i].rightID = right;    data[i].minVal = INT_MAX;    if (left == right)    {        father[left] = i;        return;    }    Build(i << 1, left, middle);    Build(i << 1 | 1, middle + 1, right);}void Update(int id){    if (id == 1)    {        return;    }    int father = id >> 1;    data[father].minVal = min(data[father << 1].minVal, data[father << 1 | 1].minVal);    Update(id >> 1);}void Query(int i, int l, int r, int & result){    if (data[i].leftID == l&&data[i].rightID == r)    {        result = min(result, data[i].minVal);        return;    }    int middle = (data[i].leftID + data[i].rightID) >> 1;    if (l <= middle)    {        if (r <= middle)        {            Query(i << 1, l, r, result);        }        else        {            Query(i << 1, l, middle, result);        }    }    if (r >= middle + 1)    {        if (l >= middle + 1)        {            Query(i << 1 | 1, l, r, result);        }        else        {            Query(i << 1 | 1, middle + 1, r, result);        }    }}int main(){    int n, m;    scanf("%d", &n);    Build(1, 1, n);    for (int i = 1; i <= n; i++)    {        scanf("%d", &data[father[i]].minVal);        Update(father[i]);    }    scanf("%d", &m);    int flag, left, right, pos, val;    for (int i = 0; i<m; i++)    {        scanf("%d", &flag);        if (flag == 0)        {            scanf("%d%d", &left, &right);            int result = INT_MAX;            Query(1, left, right, result);            printf("%d\n", result);        }        else        {            scanf("%d%d", &pos, &val);            data[father[pos]].minVal = val;            Update(father[pos]);        }    }    return 0;}
0 0