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

来源:互联网 发布:剑灵飞月身体数据 编辑:程序博客网 时间:2024/04/20 18:03

以前不知在哪看了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 100005int 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;    } 


 

 

0 0
原创粉丝点击