关于node N= (node){l,r,sum} 和node N= node(l,r,sum)

以前不知在哪看了node N= (node){l, r, sum} 这种赋值方式, 然后就觉得很吊,后面就总是用这个赋值

不过之前发现一个问题这样写在杭电上面交C++ 是CE的 不过交G++能过, 不过其他有些OJ交C++也是能过的

所以今天为了安全起见,我以后还是写node N=  node(l,r,sum); 吧。。。 不过这样要先在类中写构造函数

例如 杭电1003

提交C++会CE 提交G++会AC 代码:

#include <cstdio>
#include <cstring>
#define maxn 100005

int a[maxn];

struct node
{
    int l, r;
    int sum;
};

node maxsum(int a[], int l, int r) //区间[l,r)的最大值 
{
//    printf("%d %d\n",l, r);
    if(l+1 == r|| l==r)
        return (node){l, l, a[l]};
    int mid= (l + r)/ 2;
    node sum_l= maxsum(a, l, mid); //左区间[l, mid)的最大值 
    node sum_r= maxsum(a, mid, r);//右区间[mid, r)的最大值   
    node M= sum_l.sum >= sum_r.sum ? sum_l : sum_r;
    int  v= 0, mid_l= a[mid-1],mid_r= a[mid], x= mid-1, y= mid;
    for(int i= mid-1; i>= l; i--)//从分界点开始往左,左边取最小,所以a[i]>= 0
    {
        v+= a[i];
        if(v>= mid_l)
            mid_l= v, x= i; 
    }
    v= 0;
    for(int i= mid; i< r;  i++)//从分界点开始往右,右边取最小,所以a[i]>0 
    {
        v+= a[i];
        if(v> mid_r)             
            mid_r= v, y= i;
    }
    if(mid_l + mid_r < M.sum)  
        return M;
    else
        return (node){x, y, mid_l+mid_r};                
}

int main()
{
    int C;
    scanf("%d",&C);
    for(int c= 1; c<= C; c++)
    {
        int n;
        scanf("%d",&n);
        for(int i= 1; i<= n; i++)
            scanf("%d",&a[i]);
        node ans= maxsum(a, 1, n+1);
        if(c!= 1)
            printf("\n");    
        printf("Case %d:\n%d %d %d\n",c, ans.sum, ans.l, ans.r);
    }
    return 0;
} 


 

G++,C++都能AC代码:

    #include <cstdio>
    #include <cstring>
    #define maxn 100005
    
    int a[maxn];
    
    struct node
    {
        int l, r;
        int sum;
        node(){}
        node(int x, int y, int z):
            l(x), r(y), sum(z){}
    };
    
    node maxsum(int a[], int l, int r) //区间[l,r)的最大值 
    {
    //    printf("%d %d\n",l, r);
        if(l+1 == r|| l==r)
            return node(l, l, a[l]);
        int mid= (l + r)/ 2;
        node sum_l= maxsum(a, l, mid); //左区间[l, mid)的最大值 
        node sum_r= maxsum(a, mid, r);//右区间[mid, r)的最大值   
        node M= sum_l.sum >= sum_r.sum ? sum_l : sum_r;
        int  v= 0, mid_l= a[mid-1],mid_r= a[mid], x= mid-1, y= mid;
        for(int i= mid-1; i>= l; i--)//从分界点开始往左,左边取最小,所以a[i]>= 0
        {
            v+= a[i];
            if(v> mid_l) //!!!!!!!!>=
                mid_l= v, x= i; 
        }
        v= 0;
        for(int i= mid; i< r;  i++)//从分界点开始往右,右边取最小,所以a[i]>0 
        {
            v+= a[i];
            if(v> mid_r)             
                mid_r= v, y= i;
        }
        node res;
        if(mid_l + mid_r < M.sum)  
            return M;
        else
            return res = node(x, y, mid_l+mid_r);                
    }
    
    int main()
    {
        int C;
        scanf("%d",&C);
        for(int c= 1; c<= C; c++)
        {
            int n;
            scanf("%d",&n);
            for(int i= 1; i<= n; i++)
                scanf("%d",&a[i]);
            node ans= maxsum(a, 1, n+1);
            if(c!= 1)
                printf("\n");    
            printf("Case %d:\n%d %d %d\n",c, ans.sum, ans.l, ans.r);
        }
        return 0;
    } 


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值