下面是wrong answer的代码:however,I have found where I am wrong.果然是数组问题,自己写的模板没问题,按照我这样写每次都要刷新一遍segtree数组为0,否则的话前面遗留的数据会让后面比较max的时候出错,然后我就AC了!
<pre name="code" class="cpp">#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int Maxn = 200000 + 5;
int a[Maxn];
struct seg
{
int l,r,Max;
}segtree[Maxn*4];
void build(int node,int l,int r)
{
segtree[node].l=l;
segtree[node].r=r;
if(l==r)
{
segtree[node].Max=a[l];
return;
}
else
{
int mid=(l+r)>>1;
build(node<<1,l,mid);
build(node<<1|1,mid+1,r);
segtree[node].Max=max(segtree[node<<1].Max,segtree[node<<1|1].Max);
}
}
int find_max(int node,int x,int y)
{
if(segtree[node].l==x&&segtree[node].r==y)
return segtree[node].Max;
if(segtree[node<<1].r>=y)
{
return find_max(node<<1,x,y);
}
else if(segtree[node<<1|1].l<=x)
{
return find_max(node<<1|1,x,y);
}
else
{
int mid = segtree[node].l + segtree[node].r;
mid>>=1;
return max(find_max(node<<1,x,mid) , find_max(node<<1|1,mid+1,y));
}
}
void update(int node,int x,int y)//自己创作的模版,只要把这个改成标准的模版就能过了
{
if(segtree[node].l<=x&&segtree[node].r>=x)
{
if(segtree[node].l==segtree[node].r)
{
segtree[node].Max=y;
return;
}
else
{
update(node<<1,x,y);
update(node<<1|1,x,y);
segtree[node].Max=max(segtree[node<<1].Max,segtree[node<<1|1].Max);
}
}
else
return;
}
int main()
{
int n,m,x,y;
char ope[2];
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(segtree,0,sizeof(segtree));//就是这个地方,每次都要完完整整地刷新一遍segtree,因为我的更新操作是先向下探再判断的
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
build(1,0,n-1);
while(m--)
{
scanf("%s",&ope);
if(ope[0]=='Q')
{
scanf("%d%d",&x,&y);
printf("%d\n",find_max(1,x-1,y-1));
}
else
{
scanf("%d%d",&x,&y);
update(1,x-1,y);
}
}
}
return 0;
}
这个是我AC的模版:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int Maxn = 200000 + 5;
int a[Maxn];
struct seg
{
int l,r,Max;
}segtree[Maxn*4];
void build(int node,int l,int r)
{
segtree[node].l=l;
segtree[node].r=r;
if(l==r)
{
segtree[node].Max=a[l];
return;
}
else
{
int mid=(l+r)>>1;
build(node<<1,l,mid);
build(node<<1|1,mid+1,r);
segtree[node].Max = max(segtree[node<<1].Max, segtree[node<<1|1].Max);
}
}
int find_max(int node,int x,int y)
{
if(segtree[node].l==x&&segtree[node].r==y)
return segtree[node].Max;
if(segtree[node<<1].r>=y)
{
return find_max(node<<1,x,y);
}
else if(segtree[node<<1|1].l<=x)
{
return find_max(node<<1|1,x,y);
}
else
{
int mid = segtree[node].l + segtree[node].r;
mid>>=1;
return max(find_max(node<<1,x,mid) , find_max(node<<1|1,mid+1,y));
}
}
void refreash(int node,int x,int y)
{
if(segtree[node].l==x&&segtree[node].r==x)
{
segtree[node].Max=y;
return;
}
if(segtree[node<<1].r >= x)
refreash(node<<1,x,y);
else
refreash(node<<1|1,x,y);
segtree[node].Max=max(segtree[node<<1].Max,segtree[node<<1|1].Max);
}
int main()
{
int n,m,x,y;
char ope[3];
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
build(1,0,n-1);
while(m--)
{
scanf("%s",&ope);
if(ope[0]=='Q')
{
scanf("%d%d",&x,&y);
printf("%d\n",find_max(1,x-1,y-1));
}
else
{
scanf("%d%d",&x,&y);
refreash(1,x-1,y);
}
}
}
return 0;
}