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