C.Dominated Subarray
2024-10-10 08:02:21
题目:受主导的子序列##
题意:序列t至少有2个元素,我们称序列t被数字出现次数最多的元素v主导,且出现次数最多的元素必须是唯一的
你被给予了序列a1, a2, ..., an,计算它的最短受主导子序列,或者说这里没有这种序列
[4, 1, 2, 4, 5, 4, 3, 2, 1]的最短受主导子序列为[4, 5, 4]
链接:(受主导的子序列)[https://codeforces.com/contest/1257/problem/C]
分析:我们可以检查每个相同数字(受主导的元素)的对,求出它们之间的距离,然后在每对距离里取最小值
但是可以有更好的方法,时间复杂度为O(n),我们可以从头开始检查元素,如果出现相同的元素,就求出它们之间的距离,然后将后面的元素作为下一段开始受主导子序列的开头。
证明:每段受主导子序列是两两分明,且里面没有两端相同的元素,否则则会产生更短的受主导子序列
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
const int N = 2e5 + 5;
const int INF = 0x3f3f3f3f;
vector<int> a;
void solve()
{
int n;
cin >> n;
a.resize(n + 1);
for (int i = 0; i < n; ++i)
cin >> a[i];
if (n == 1)
{
cout << -1 << endl;
return;
}
int ans = INF;
vector<int> lst(n + 1, -1);//n + 1个 -1
for (int i = 0; i < n; i++) {
if (lst[a[i]] != -1)
ans = min(ans, i - lst[a[i]] + 1);
lst[a[i]] = i;
}
if (ans > n)
ans = -1;
cout << ans << endl;
a.clear();
lst.clear();
}
int main()
{
int T;
cin >> T;
for (int i = 1; i <= T; ++i)
{
solve();
}
return 0;
}
最新文章
- FileStream读写文件【StreamWriter 和 StreamReader】
- bzoj2243树链剖分+染色段数
- js 把数字转成2 ,8,16进制的方法
- [AlwaysOn Availability Groups]DMV和系统目录视图
- 递推 hdu 2048
- 三:Go编程语言规范-表达式
- log4net注意事项
- 【avalon】offsetParent
- [OC Foundation框架 - 20] 统计代码行数
- QT5在VS2013中找不到QtNetwork或QTcpSocket或QTcpSocket等头文件
- 基于visual Studio2013解决C语言竞赛题之1067间隔排序
- cmd 3389
- 树链剖分X2
- laravel5单元测试
- 20175209 《Java程序设计》第六周学习总结
- 关于Socket.IO的知识点记录
- python 的基础学习 第九天 文件的操作
- 1L - ASCII码排序
- MT【81】含参数三次函数因式分解
- git clone的时候filename too long解决办法