1 条题解

  • 0
    @ 2025-8-24 22:57:32

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar PR_CYJ
    逆水行舟,不进则退

    搬运于2025-08-24 22:57:32,当前版本为作者最后更新于2024-05-02 09:06:38,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    题目传送门

    思路

    这道题 1n1061\le n\le 10^6 所以显然不是模拟,接下来就考虑数学做法。

    我们发现 wi=12(ai+ai+1)w_i=\frac{1}{2}\cdot (a_i+a_{i+1}),所以 2wi=ai+ai+12\cdot w_i=a_i+a_{i+1},然后将 2wi2\cdot w_i 记为 viv_i,所以 viv_i 就是一条边相邻两点的点权和。

    接下来就可以用 a1a_1 表示其它的点。a2a_2v1a1v_1-a_1a3a_3v2v1+a1v_2-v_1+a_1。以此类推,当 nn 为奇数时,ana_n 就是 $v_{n-1}-v_{n-2}+v_{n-3}-v_{n-4}+\cdots +v_2-v_1+a_1$。因为 a1a_1ana_n 的和是 vnv_n,所以 $a_1+v_{n-1}-v_{n-2}+v_{n-3}-v_{n-4}+\cdots +v_2-v_1+a_1=v_n$,即 2a1=vnvn1+vn2vn3++v12\cdot a_1=v_n-v_{n-1}+v_{n-2}-v_{n-3}+\cdots +v_1

    接着将右边式子分成两部分,即 vn+vn2++v1v_n+v_{n-2}+\cdots +v_1(vn1+vn3++v2)-(v_{n-1}+v_{n-3}+\cdots+v_2)。可以发现,若要使 a1a_1 最大,就要使 vn+vn2++v1v_n+v_{n-2}+\cdots +v_1 最大,vn1+vn3++v2v_{n-1}+v_{n-3}+\cdots+v_2 最小。而 a1a_1 最小时则相反。

    最后只需要将 ww 数组排序然后间隔输出即可。

    代码

    • 切勿抄袭!!!
    #include<bits/stdc++.h>
    using namespace std;
    int n,smnw,bgnw,a[1000010];
    int main()
    {
    	ios::sync_with_stdio(0);
    	cin>>n;
    	for(int i=1;i<=n;i++)
    		cin>>a[i];
    	sort(a+1,a+n+1);
    	cout<<a[n/2+1];
    	smnw=1;
    	bgnw=n/2+2;
    	for(int i=2;i<=n;i++)//当a1最大时
    		if (i&1)
    		{
    			cout<<" "<<a[bgnw];
    			bgnw++;
    		}
    		else
    		{
    			cout<<" "<<a[smnw];
    			smnw++;
    		}
    	cout<<endl<<a[1];
    	smnw=2;
    	bgnw=n/2+2;
    	for(int i=2;i<=n;i++)//当a1最小时
    		if (i&1)
    		{
    			cout<<" "<<a[smnw];
    			smnw++;
    		}
    		else
    		{
    			cout<<" "<<a[bgnw];
    			bgnw++;
    		}
    }
    
    • 1

    信息

    ID
    8280
    时间
    1000ms
    内存
    512MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者