专栏文章

题解:P14131 【MX-X22-T2】「TPOI-4B」K Problem

P14131题解参与者 1已保存评论 1

文章操作

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

当前评论
1 条
当前快照
1 份
快照标识符
@minq0qjt
此快照首次捕获于
2025/12/02 06:28
3 个月前
此快照最后确认于
2025/12/02 06:28
3 个月前
查看原文

解题思路

模拟,把所以可能的 kk 都列举一遍。
可以得出这个区间的长度 len=k×(k+1)2len=\dfrac{k\times(k+1)}2。然后,对于所有长度为 lenlen 的区间判断元素个数是否合法。注意,这里的枚举区间的元素个数必须像滑动窗口一样,右边进左边出,否则会导致时间复杂度过大。
这里的 kk 的最大值在 450450 以下(因为 450×4512>105\dfrac{450\times451}2>10^5)。我在赛时直接使 k=maxi=1naik=\max\limits_{i=1}^na_i,痛失 20 pts\text{20 pts}

Code

CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
int a[100010],b[100010],n;
bool pd(int mid)
{
	for(int i=1;i<=mid;i++)
		if(b[i]!=i)return 0;
	return 1;
}
bool ck(int x)
{
	memset(b,0,sizeof b);
	int len=(x+1)*x/2;
	for(int i=1;i<=n;i++)
	{
		b[a[i]]++;
		if(i>len)b[a[i-len]]--;
		if(i>=len&&pd(x))return 1;
	}
	return 0;
}
signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	int t;
	cin>>t;
	BREAK:
	while(t--)
	{
		cin>>n;
		for(int i=1;i<=n;i++)
			cin>>a[i];
		for(int i=450;i>=1;i--)
			if(ck(i))
			{
				cout<<i<<'\n';
				goto BREAK;
			}
		cout<<"0\n";
	}
	return 0;
}

评论

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

正在加载评论...