原题为洛谷P1531。
因为涉及字符类型所以比较麻烦,一开始用getchar结果因为某种神秘力量并没有过[躺]。
后来看了题解[捂脸],发现题解上用的string就用上了结果过了……
大体上就是个简单粗暴的线段树模板。
顺便这个题的函数里参数比较多不要打昏了头,不然会出现非常神奇的错误提示[惊吓.jpg]
具体讲解链接
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<algorithm>
#include<stdio.h>
using namespace std;
int m,n,i,x,y,a[210000],st[1100000];
string f,c;
void build(int o,int l,int r)
{
if(l==r) st[o]=a[l];
else
{
int m=(l+r)>>1;
build(o<<1,l,m);
build((o<<1)|1,m+1,r);
st[o]=max(st[o<<1],st[(o<<1)|1]);
}
}
int search(int o,int l,int r,int ql,int qr)
{
if(ql<=l&&qr>=r) return st[o];
if(ql>r||qr<l) return -1;
int m=(l+r)>>1;
int p1=search(o<<1,l,m,ql,qr);
int p2=search((o<<1)|1,m+1,r,ql,qr);
return max(p1,p2);
}
void change(int o,int l,int r,int ind,int ch)
{
if(l==r) st[o]=ch;
else
{
int m=(l+r)>>1;
//别忘了判断ind在哪一边
if(ind<=m)
change(o<<1,l,m,ind,ch);
if(ind>m)
change((o<<1)|1,m+1,r,ind,ch);
st[o]=max(st[o<<1],st[(o<<1)|1]);
}
}
int main()
{
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
build(1,1,n);
for(i=1;i<=m;i++)
{
cin>>f;
scanf("%d%d",&x,&y);
if(f=="Q")
printf("%d\n",search(1,1,n,x,y));
if(f=="U")
{
if(a[x]<y)
{
a[x]=y;
change(1,1,n,x,y);
}
}
}
return 0;
}
附上另一个基本一样的模板,把字符改成了数字
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<algorithm>
#include<stdio.h>
using namespace std;
int m,n,i,f,x,y,a[210000],st[1100000];
void build(int o,int l,int r)
{
if(l==r) st[o]=a[l];
else
{
int m=(l+r)>>1;
build(o<<1,l,m);
build((o<<1)|1,m+1,r);
st[o]=max(st[o<<1],st[(o<<1)|1]);
}
}
int search(int o,int l,int r,int ql,int qr)
{
if(ql<=l&&qr>=r) return st[o];
if(ql>r||qr<l) return -1;
int m=(l+r)>>1;
int p1=search(o<<1,l,m,ql,qr);
int p2=search((o<<1)|1,m+1,r,ql,qr);
return max(p1,p2);
}
void change(int o,int l,int r,int ind,int ch)
{
if(l==r) st[o]=ch;
else
{
int m=(l+r)>>1;
if(ind<=m)
change(o<<1,l,m,ind,ch);
if(ind>m)
change((o<<1)|1,m+1,r,ind,ch);
st[o]=max(st[o<<1],st[(o<<1)|1]);
}
}
int main()
{
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
build(1,1,n);
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&f,&x,&y);
if(f==1)
printf("%d\n",search(1,1,n,x,y));
if(f==2)
change(1,1,n,x,y);
}
return 0;
}