思路:
利用线段树实现,具体参考:[算法系列之二十三]线段树(Interval Tree)
代码
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
#define Max 200001
struct IntervalTreeNode{
int left,right,mid;
int weight;
};
IntervalTreeNode interval[3*Max];
void PushUp(int num){
interval[num].weight = max(interval[2*num].weight,interval[2*num+1].weight);
}
void Create(int left,int right,int num,int w[]){
interval[num].left = left;
interval[num].right = right;
interval[num].mid = left + (right - left) / 2;
if(left == right){
interval[num].weight = w[left-1];
return;
}
Create(left,interval[num].mid,2*num,w);
Create(interval[num].mid+1,right,2*num+1,w);
PushUp(num);
}
void Update(int pos,int score,int left,int right,int num){
if(left == right){
interval[num].weight = score;
return;
}
int mid = interval[num].mid;
if(pos <= mid){
Update(pos,score,left,mid,2*num);
}
else{
Update(pos,score,mid+1,right,2*num+1);
}
PushUp(num);
}
int Query(int left,int right,int num){
if(interval[num].left == left && interval[num].right == right){
return interval[num].weight;
}
if(right <= interval[num].mid){
return Query(left,right,2*num);
}
else if(left > interval[num].mid){
return Query(left,right,2*num+1);
}
else{
return max(Query(left,interval[num].mid,2*num),Query(interval[num].mid+1,right,2*num+1));
}
}
int main(){
int N,M,a,b;
char op[2];
int score[Max];
while(scanf("%d %d",&N,&M) != EOF){
for(int i = 0;i < N;++i){
scanf("%d",&score[i]);
}
Create(1,N,1,score);
for(int i = 0;i < M;++i){
scanf("%s %d %d",op,&a,&b);
if(op[0] == 'Q'){
cout<<Query(a,b,1)<<endl;
}
else if(op[0] == 'U'){
Update(a,b,1,N,1);
}
}
}
return 0;
}
<script type="text/javascript">
$(function () {
$('pre.prettyprint code').each(function () {
var lines = $(this).text().split('\n').length;
var $numbering = $('<ul/>').addClass('pre-numbering').hide();
$(this).addClass('has-numbering').parent().append($numbering);
for (i = 1; i <= lines; i++) {
$numbering.append($('<li/>').text(i));
};
$numbering.fadeIn(1700);
});
});
</script>
分享到:
相关推荐
hdu 1166线段树代码
从简单入门到偏中等的几个题,线段树很灵活,主要懂了lazy操作,其他的自己yy吧。
hdu 1166线段树
算术(HDU-6715).rar
杭电操作系统实验 HDU操作系统实验.zip
最短路(HDU-2544).rar
数字图像处理总ppt_hdu_许老师.pdf
算法-数塔(HDU-2084).rar
算法-确定比赛名次(HDU-1285).rar
高级计算机图形学_mm的_重点笔记_hdu_吴xy.pdf
经典算法:(二分匹配,背包专题,筛选法,简单数学题,贪心算法,递推求解,动态规划,并查集,母函数,搜索,组合博弈等入门算法)
杭电的一些acm题目,都是我自己一个一个自己提交的
求多源点到单终点的最短路(反向建图),ACM竞赛中应用的小程序。