晚上覆习一下线段树...结果还是搞了20分钟才ac...万恶的cin最好不要用了 可能超时
题目链接 点击打开链接
代码:
直接模版就行了,在build,update时更新最大值就好了
<strong><span style="font-size:18px;color:#ff6600;">#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define N 200005
struct node
{
int l,r,n;
} a[3*N]; //最好开到3倍
int s[N];
void build(int l,int r,int i)
{
a[i].l=l;
a[i].r=r;
if(l==r)
{
a[i].n=s[l]; //找到叶子结点,更新
return;
}
int mid=(l+r)/2;
build(l,mid,2*i);
build(mid+1,r,2*i+1);
a[i].n=max(a[2*i].n,a[2*i+1].n); //更新最大值
}
void update(int l,int r,int i)
{
if(a[i].l==l&&a[i].r==l)
{
a[i].n=r;
return;
}
int mid=(a[i].l+a[i].r)/2;
if(l<=mid)
update(l,r,2*i);
else
update(l,r,2*i+1);
a[i].n=max(a[2*i].n,a[2*i+1].n); //更新最大值
}
int query(int l,int r,int i)
{
if(a[i].l==l&&a[i].r==r)
{
return a[i].n;
}
int mid=(a[i].l+a[i].r)/2;
if(r<=mid)
return query(l,r,2*i);
else if(l>mid)
return query(l,r,2*i+1);
else
return max(query(l,mid,2*i),query(mid+1,r,2*i+1));
}
int main()
{
int n,m,i;
while(~scanf("%d%d",&n,&m)) //不要用cin...比赛各种超时
{
for(i=1; i<=n; i++)
cin>>s[i];
build(1,n,1);
while(m--)
{
getchar(); //这个小玩意不要忘了 要不会把回车读进去..
char o;int x,y;
scanf("%c%d%d",&o,&x,&y);
if(o=='Q')
cout<<query(x,y,1)<<endl;
else
update(x,y,1);
}
}
}
</span></strong>