1 条题解

  • 0
    @ 2025-8-24 23:09:02

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar M1__
    INTJ | cnblogs.com/M136e1

    搬运于2025-08-24 23:09:02,当前版本为作者最后更新于2025-01-29 20:14:25,作者可能在搬运后再次修改,您可在原文处查看最新版

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

    以下是正文


    题解:P11638 Max,Mex

    题目传送门

    前置知识

    i=1nai=a1+a2+a3+a4+a5++an\sum_{i=1}^n a_i=a_1+a_2+a_3+a_4+a_5+ \cdots+a_n

    思路

    本题中定义 max{S}\max\{S\}SS 中的最大值,mex{S}\operatorname{mex}\{S\}SS 中最小没出现过的自然数。一次操作你可以选定一个 (i,j)(i,j),满足 1i,jn1\le i,j\le n 以及 iji\neq j,令 x=max{ai,aj}x=\max\{a_i,a_j\}y=mex{ai,aj}y=\operatorname{mex}\{a_i,a_j\},那么 ai=xa_i=xaj=ya_j=y

    subtask 1&2

    • 对于 subtask1 与 subtask2,直接输出 sumsum 即可。证明如下:
      • ai2a_i \ge 2 时,mex{ai,aj}=0\operatorname{mex}\{a_i,a_j\}=0,即 aj=0a_j=0,对 i=1nai\sum_{i=1}^n a_i 没有贡献,所以不需要进行操作,在代码中进行特判即可。这样可拿到 [10,30][10,30] 分。

    subtask 3&4

    • 对于 subtask3 与 subtask4,因为无特殊性质,所以需要判断关于 mex{ai,aj}\operatorname{mex}\{a_i,a_j\} 的所有情况,求出他们分别对 i=1nai\sum_{i=1}^n a_i 的贡献值并得出规律。

    • 我们会发现如下规律:

      • 对于一个操作,不论是 mex{ai,aj}\operatorname{mex}\{a_i,a_j\} 还是 max{ai,aj}\max\{a_i,a_j\},只要 ai,aj2a_i,a_j \ge 2 时,根据 subtask 1&2 的结论,再进行操作显然对 i=1nai\sum_{i=1}^n a_i 没有贡献,所以我们只需统计数列中小于 22 的个数和大于等于 22 的数之和,并求出小于 22 的数的最大贡献值即可。
      • 因此,对于一组 ai,aja_i,a_j 有以下几种情况:
        • ai=0,aj=0a_i=0,a_j=0 时,令 aj=mex{0,0}=1a_j=\operatorname{mex}\{0,0\}=1。此时 ai=0,aj=1a_i=0,a_j=1
        • ai=0,aj=1a_i=0,a_j=1 时,令 ai=max{0,1}=1a_i=\max\{0,1\}=1aj=mex{0,1}=2a_j=\operatorname{mex}\{0,1\}=2。此时 ai=1,aj=2a_i=1,a_j=2
        • ai=1,aj=2a_i=1,a_j=2 时,令 ai=max{1,2}=2a_i=\max\{1,2\}=2aj=mex{2,2}=0a_j=\operatorname{mex}\{2,2\}=0。此时 ai=2,aj=0a_i=2,a_j=0。显然对 i=1nai\sum_{i=1}^n a_i 没有贡献,所以这个操作要舍去。
      • 综上,我们一共操作了三次,操作过后结果为 ai=1,aj=2a_i=1,a_j=2,此时贡献值为 1+2=31+2=3
      • 因此,我们可以推导出 subtask 3&4 的通项公式。即对于 cntcnt00ansans11,最后会有 cnt+ans1cnt+ans-1 个数操作成 22,剩下的一个数无法进行操作,即为 11。即对于小于等于 22ai,aja_i,a_j,最大贡献次数为:2×((cnt+ans)1)+12 \times ((cnt+ans)-1)+1
      • 因此,subtask 3&4 的通项公式为:i=1nai+2×((cnt+ans)1)+1ans\sum _{i=1}^n a_i+2 \times ((cnt+ans)-1)+1-ans 即:$$\sum _{i=1}^n [a_i\neq 0 \wedge a_i \neq 1 ]+2 \times cnt + ans-1 $$

    关于hack数据

    事实上,这是本代码的一个小 Bug。
    n=1,ai=0n=1,a_i=0 时,因为之前 cntcnt 记录 00 的个数时,cntcnt 便不会为 00,因此卡过了上文中的关于 subtask1 的部分。所以只要在这之前进行特判便没有问题了。

    代码实现

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    ll cnt,ans,sum,n,a;
    int main(){
    	cin>>n;
    	for(int i=1;i<=n;i++){
    		cin>>a;
    		sum+=a;
    		if(n==1){
    			cout<<a;
    			return 0;
    		}
    		if(a==0) cnt++;
    		if(a==1) ans++;
    	}
    	if(cnt+ans==0) cout<<sum;
    	else cout<<cnt*2+ans+sum-1;
    	return 0;
    }
    
    

    本题思维难度略大,代码实现方面比较简单。

    • 1

    信息

    ID
    10887
    时间
    1000ms
    内存
    4~512MiB
    难度
    3
    标签
    递交数
    0
    已通过
    0
    上传者