題目鏈接:點擊打開鏈接
給出一個序列, 一段子序列含有兩個相同的數字稱爲happy segment, 要求分爲最多的happy segment, 輸出每段序列起點終點.
考慮存儲數據的數據結構, 使用set解決此問題, 遇到重複的元素則存儲位置且清空set, 同時要滿足第一段序列的起點爲1且最後一段序
列的終點爲n 即可.
AC 代碼:
#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"
#include "queue"
#include "stack"
#include "cmath"
#include "utility"
#include "map"
#include "set"
#include "vector"
#include "list"
#include "string"
#include "cstdlib"
using namespace std;
typedef long long ll;
const int MOD = 1e9 + 7;
const int INF = 0x3f3f3f3f;
const int MAXN = 3e5 + 5;
int n, pos[MAXN], k;
set<int> s;
int main(int argc, char const *argv[])
{
scanf("%d", &n);
for(int i = 1; i <= n; ++i) {
int x;
scanf("%d", &x);
if(s.count(x) == 0) s.insert(x);
else {
pos[k++] = i;
s.clear();
}
}
if(k == 0) printf("-1\n");
else {
pos[k - 1] = n;
printf("%d\n", k);
printf("1 %d\n", pos[0]);
for(int i = 0; i < k - 1; ++i)
printf("%d %d\n", pos[i] + 1, pos[i + 1]);
}
return 0;
}