1

我解决了代码中显示的给定问题,但我得到了错误的答案。我使用了分段树方法。节点包含 max1(给定范围内的最大数量)和 sum(给定范围内两个数量的最大总和)。请帮忙。

#include<iostream>
#include<cstdio>
#include<math.h>
using namespace std;
struct node
{
    long long int max1;
    long long int sum;
};
node constructstutil(int a[],node tree[],int st,int end,int index)
{
    if(st==end)
    {
        tree[index].max1=a[st];
        tree[index].sum=a[st];
        return tree[index];
    }
    int mid=(st+end)/2;
    node i=constructstutil(a,tree,st,mid,2*index+1);
    node j=constructstutil(a,tree,mid+1,end,2*index+2);
    int max2=i.max1+j.max1;
    if(max2> i.sum&& max2>j.sum)
    {
        tree[index].max1=max(i.max1,j.max1);
        tree[index].sum=max2;
        return tree[index];
    }
    else
    {
        if(i.sum>j.sum)
        {
            tree[index].max1=max(i.max1,j.max1);
            tree[index].sum= i.sum;
            return tree[index]; 
        }
        else
        {
            tree[index].max1=max(i.max1,j.max1);
            tree[index].sum=j.sum;
            return tree[index];
        }
    }
}
node* constructst(int a[],int n)
{
    int size,k;
    k=(int)(ceil(log2(n)));
    size=2*(int)pow(2,k)+1;
    node* tree=new node[size];
    constructstutil(a,tree,0,n-1,0);
    return tree;
}
void updatevalueutil(int a[],node tree[],int s,int e,int i,int val,int index)
{
    if(i>e||i<s)
        return;
    if(s==e&& s== i)
    {
        tree[index].max1=val;
        tree[index].sum=val;
        return;
    }
    int mid=(s+e)/2;
    updatevalueutil(a,tree,s,mid,i,val,2*index+1);
    updatevalueutil(a,tree,mid+1,e,i,val,2*index+2);
    int i1=2*index+1;
    int i2=2*index+2;

    int max2=tree[i1].max1+tree[i2].max1;
    if(max2> tree[i1].sum && max2>tree[i2].sum)
    {
        tree[index].max1=max(tree[i1].max1,tree[i2].max1);
        tree[index].sum=max2;
    }
    else
    {
        if(tree[i1].sum>tree[i2].sum)
        {
            tree[index].max1=max(tree[i1].max1,tree[i2].max1);
            tree[index].sum= tree[i2].sum;
        }
        else
        {
            tree[index].max1=max(tree[i1].max1,tree[i2].max1);
            tree[index].sum=tree[i2].sum;
        }
    }
}
void updatevalue(int a[],int n,node tree[],int i,int val)
{
    a[i]=val;
    updatevalueutil(a,tree,0,n-1,i,val,0);

}
node queryutil(int a[],node tree[],int qs,int qe,int s,int e,int index)
{
    node t;
    t.max1=t.sum=0;
    if(qs<=s&&qe>=e)
        return tree[index];
    if(qs>e || qe<s || qs>qe)
        return t ;
    int mid=(s+e)/2;
    node i=queryutil(a,tree,qs,qe,s,mid,2*index+1);
    node j=queryutil(a,tree,qs,qe,mid+1,e,2*index+2);
    int max2=i.max1+j.max1;
    if(max2> i.sum&& max2>j.sum)
    {
        t.sum=max2;
        t.max1=max(i.max1,j.max1);
        return t;
    }
    else
    {
        if(i.sum>j.sum)
        {
            t.sum= i.sum;
            t.max1=max(i.max1,j.max1);
            return t; 
        }
        else
        {
            t.sum=j.sum;
            t.max1=max(i.max1,j.max1);
            return t;
        }
    }


}
long long int query(int a[],int n,node tree[],int qs,int qe)
{
    int s=0;
    int e=n-1;
    node t= queryutil(a,tree,qs,qe,s,e,0);
    return t.sum;
}
int main()
{
        int n;
        scanf("%d",&n);
        int a[n];
        for(int i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
        }
        node* tree=constructst(a,n);
        int k;
        scanf("%d",&k);
        while(k--)
        {
            char ch;
            int index,val;
            int qs,qe,ans;
            cin>>ch;
            if(ch=='U')
            {
                scanf("%d %d",&index,&val);
                updatevalue(a,n,tree,index-1,val);
            }
            else if (ch=='Q')
            {
                scanf("%d %d",&qs,&qe);
                long long int ans=query(a,n,tree,qs-1,qe-1);
                printf("%lld\n",ans);
            }

        }
}
4

0 回答 0