结合他人题解以及自己瞎琢磨得到的一些理解,有错误还请指正,谢谢!!
#include "bits/stdc++.h"
using namespace std;
typedef long long LL;
const int N = 3e5 + 10;
int t, n;
LL s[N], a[N]; // s为前缀和数组 a为存放前缀和顺序的数组
bool st[N];
int main()
{
cin >> t;
while (t--)
{
cin >> n;
memset(st, 0, sizeof st);
for (int i = 1; i <= n; i++)
cin >> s[i], s[i] += s[i - 1];
LL s0 = s[0], sn = s[n];
if (s0 > sn)
swap(s0, sn);
sort(s, s + n + 1);
// 寻找排完序后s0和sn的位置
// 如果s0和sn相同的话则前面的为s0 后面的为sn
for (int i = 0; i <= n; i++)
if (s[i] == s0)
{
s0 = i;
break;
}
for (int i = n; i >= 0; i--)
if (s[i] == sn)
{
sn = i;
break;
}
int l = 0, r = n;
for (int i = s0; i >= 0; i -= 2)
{
a[l++] = s[i];
st[i] = 1;
}
for (int i = sn; i <= n; i += 2)
{
a[r--] = s[i];
st[i] = 1;
}
for (int i = 0; i <= n; i++)
if (!st[i])
a[l++] = s[i];
LL res = 0;
for (int i = 1; i <= n; i++)
res = max(res, abs(a[i] - a[i - 1]));
cout << res << endl;
}
return 0;
}
acwing的题解区还是非常奈斯的,大致含义和思路理解了,不过最后那一点排序的核心没看懂。。
总算是勉强弄懂了,好多地方只能被动接受,自己很难思考到。。
嗯 这些题都好难 y总讲完自己还要理解好久为啥
nice!!!!!!
好奇问一下是什么软件😃
GoodNotes
好的
黑色那幅图到底是什么意思捏 我好菜看不懂(悲)
为什么
// 寻找排完序后s0和sn的位置
// 如果s0和sn相同的话则前面的为s0 后面的为sn
??
我试了一下s0取后面答案错了,这有什么误差呢
s0如果取后边, 往左走需要的点数会变多, 会使得第二段某个位置变稀疏
题解写的很棒,但是感觉仍有可以补充的地方:
1. s0和sn的相对大小并不确定,可以补充另外一种s0>sn的情况(虽然最后可以视为一种情况,但是有点事后诸葛亮的感觉)
2. 如果中间存在元素和s0、sn大小相同,选哪个s0作为起点更好?
ps:刚刚自己证明了一下对于如果有元素和s0、sn相同,无论选择哪一个作为起点结果都是一样的
woc感谢题解 尤其是黑色部分!!!
一起进步呀!
这字写的相当赏心悦目, 真棒啊
字不够内容来凑hhh
hhh, 太感谢了
写得好好啊
希望对大家学习都有帮助!
跨一个效率很低吗?看不出来有多大差别呀
而且隔着跨不会影响最后的结果吗
一次跨几个影响的是最大值中的最小值,图中黑字的三个图可以反应出来。得出跨一个是贪心得到的,然后最下面的图是对贪心的简略证明。
nice !!你赞有了hhh
一起加油!!
这笔记写的,不得不给你点个赞了👍
好棒
一起加油!!