专栏文章

题解:P12280 [蓝桥杯 2024 国 Python A] 特别的数组

P12280题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@min3rhm8
此快照首次捕获于
2025/12/01 20:05
3 个月前
此快照最后确认于
2025/12/01 20:05
3 个月前
查看原文

题目大意

题面已经说明清楚不做补充。

思路启发

如果我们知道特别的数组的长度最大是多少哪么我们就可以通过构造判断可不可以是这个最大值,所以这个题我们可以想到二分答案。

思路

  • 先二分出最大值。
  • 在判断函数中,因为 ai105a_i \le 10^5,所以可以直接用一个桶数组来存储 aia_i 出现的次数,接下来在 ax+1a_x+1ana_n 这几个数如果总的出现次数为 22,那就将其用一个变量存储下来(之后要用,这里用 cntcnt)。
  • 特殊情况:如果 cnt=0cnt=0,说明二分到的答案大了需要变小,返回 11
  • 我们从 11 枚举到 nxn-x,这里被我分成了两个步骤,第一个是增加 aia_i 的出现次数,如果次数这时候为 22 那么 cntcnt 就加上 11;另外一种是减少 ai+xa_i+x 的出现次数,如果在操作后 x+ai=1x+a_i=1 了,那么 cntcnt 就要减 11
  • 如果在枚举循环的过程中 cnt=0cnt=0 了说明二分到的答案大了需要变小,返回 11。如果到循环结束 cntcnt 也不是 00 那么说明答案小了需要变大。

关键代码

CPP
bool check(int x){//判断函数 
	int t[100005];//桶数组 
	int cnt=0;
	for(int i=1;i<=100000;i++){
		t[i]=0;//初始值 
	}
	for(int i=x+1; i<=n; i++){//统计a[i]有多少个以及计算cnt 
	 	t[a[i]]++;
	 	if(t[a[i]]==2){
            cnt++;
        }
	}
	if(cnt==0){//特殊情况 
		return 1;
	}
	for(int i=1; i+x<=n; i++){
	 	t[a[i+x]]--;//第二种情况:减少 
	 	if(t[a[i+x]]==1){
            cnt--;
        }
	 	t[a[i]]++;//第一种情况:增加 
	 	if(t[a[i]]==2){
            cnt++;
        }
	 	if(cnt==0){//答案大了 
	 		return 1;
		 }
    }
	return 0;//答案小了 
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...