您的位置:首页 > 其它

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

2016-07-26 10:32 267 查看
华电北风吹

天津大学认知计算与应用重点实验室

2016-07-26

题目链接:

http://hihocoder.com/problemset/problem/1077

题目分析:

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

参考代码:

#include <stdio.h>
#include <algorithm>
using namespace std;

#define INT_MAX 0x7fffffff

struct 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: