晚上覆習一下線段樹...結果還是搞了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>