线段树样例没过,大佬救我
  • 板块P1531 I Hate It
  • 楼主comcopy
  • 当前回复2
  • 已保存回复2
  • 发布时间2021/8/7 13:38
  • 上次更新2023/11/4 11:44:03
查看原帖
线段树样例没过,大佬救我
388414
comcopy楼主2021/8/7 13:38

RT

#include<bits/stdc++.h>
using namespace std;
struct tree 
{
    int l;//左子节点编号 
    int r;//右... 
    int w;//该点的值 
}d[1000010];
int a[1000010];
int h=1;
int n,m; 

void build(int s,int t,int me) {
  if (s==t) { //如果到底了,就记上 
    d[me].w=a[s];
    return;
  }

  int m=s+((t-s)>>1); 
  d[me].l=++h;//先记左节点 
  build(s,m,d[me].l);//递归建左子树 
  d[me].r=++h;//记右节点 
  build(m+1,t,d[me].r);//递归建右子树 
  d[me].w=max(d[d[me].l].w,d[d[me].r].w);//该点为左右节点的最大值 
}

int change(int l,int r,int u,int v,int me)
{
    //[l,r]表示你现在所在区间,你要把u点值改为v,me表示现在所在的点 
    if(l==u && r==u)
        {
            d[u].w=v;
            return d[u].w;
        }
    int m=l+((r-l)>>1);
    int k;
    if(m<u)//如果左子节点编号小于u,说明左子树节点都小于u 
    {
        k=change(m+1,r,u,v,d[me].r);//遍历右子树 
        k=max(d[me].l,k);//由于右子树值更新,所以重新比一遍 
    }
    else
    { 
        k=change(l,m,u,v,d[me].l);//否则遍历左子树 
        k=max(d[me].r,k); //... 
    } 
    d[me].w=k;
    return d[me].w;//返回该子节点的值,用于父节点比较 
}

int finding(int l, int r, int s, int t, int me) {
    //[l,r]表示你要找的区间,[s,t]表示现在所查的区间,me表示现在所在的点 
  if (l<=s && t<=r)
  { 
    return d[me].w;//到底了,就返回这个值 
  }
  int m=s+((t-s)>>1),sum=-90000;

  if(l<=m) 
    sum=max(sum,finding(l,r,s,m,d[me].l));//比较 
  if(r>m) 
    sum=max(sum,finding(l,r,m+1,t,d[me].r));//比较,防止左右端点都包括在内的情况 
  return sum;
}

int main()
{
    cin>>n>>m;
    for(register int i=1;i<=n;++i)//初始化 
        {
            d[i].l=d[i].r=-1;
            d[i].w=-1;
        }

    for(register int i=1;i<=n;++i)
        {
            cin>>a[i];
        }

    build(1,n,1);//建树

    for(register int i=1;i<=m;++i)
        {
            char x;
            cin>>x;
            int u,v;
            cin>>u>>v;
            if(x=='U')
            {
                change(1,n,u,v,1);
            }
            else 
            { 
                cout<<finding(u,v,1,n,1)<<endl;
            }
        }
    while(1);
    return 0;
}
2021/8/7 13:38
加载中...