一开始实在不知道哪里不对,这道题就是最基础的线段树思想。
#include<iostream>
#include<stdio.h>
using namespace std;
#define M 2000002
int a[200002];
//int N=200005;
struct node
{
int left;
int right;
int max;
};
node tree[M*4];
int max(int a,int b)
{
if(a<b)
a=b;
return a;
}
void build(int id,int l,int r)
{
tree[id].left=l;
tree[id].right=r;
if(l==r)
{
tree[id].max=a[l];
}
else
{
int mid=(l+r)/2;
build(id*2,l,mid);
build(id*2+1,mid+1,r);
tree[id].max=max(tree[id*2].max,tree[id*2+1].max);
}
}
void update(int id,int pos,int zhi)
{
if(tree[id].left==tree[id].right)
tree[id].max=zhi;
else
{
int mid=(tree[id].left+tree[id].right)/2;
if(pos<=mid)
update(id*2,pos,zhi);
else
update(id*2+1,pos,zhi);
tree[id].max=max(tree[id*2].max,tree[id*2+1].max);
}
}
int query(int st,int ed,int id)
{
int left=tree[id].left,right=tree[id].right;
if(st<=left&&right<=ed)
return tree[id].max;
else
{
int mid=(tree[id].left+tree[id].right)/2;
int mx1=-999999999,mx2=-999999999;
if(st<=mid) mx1=query(st,ed,id*2);
if(ed>mid) mx2=query(st,ed,id*2+1);
return max(mx1,mx2);
}
}
int main()
{
int m,n;
int e,d;
char c;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
build(1,1,n);
//cin>>c>>e>>d;
for(int j=1;j<=m;j++)
{
cin>>c>>e>>d;
if(c=='Q')
cout<<query(e,d,1)<<endl;
else
update(1,e,d);
}
}
return 0;
}
结果样例没问题,但是WA,也真的不知道是哪错了,后来才知道是多组输入
说真的,现在就学了点皮毛,但真的是把最基础的明白了。今天晚上才看线段树专题,发现自己已经是还没做呢。这几天心里真的,一直想着补题,想着想着就没行动。我觉得必须采取一些措施,有时我可以懒到一天不碰acm,我真的是太懒了。
但是今天敲得最基础的线段树,中间有许多细节,后来慢慢解决了就很开心。然后从今天到周六,就开始做题了。我承认自己速度太慢了,是因为没投入大量时间,现在开始事少了,我会投入大量的精力,不再拖延偷懒了。多看博客,多做题,勿忘初心。自己欠的本来就多怎么有资格懒!

2180

被折叠的 条评论
为什么被折叠?



