TL-1026 String of Colorful Beads
Basic Ideas
本题不难.
设颜色存储在数组a[1...n]
中, 只需遍历一遍颜色序列, 依次求出某起点ts
(不包括)到当前点i
的最长不重复长度, 并求出其价值, 在长度相等时比较大小即可.
问题的关键在于如何设计ts
. 显然, 一开始ts
为0, 而之后的更新过程公式为, ts
= a[i]
最近出现的位置, 条件为其位置大于ts
. 请结合代码思考其正确性.
对于价值序列, 一开始我们可以先进行累加计算, 以求后面在O(1)内计算完毕.
Code in C++
#include <bits/stdc++.h>
using namespace std;
vector<int> val, tv(1), s, pos;
int main() {
int n;
cin >> n;
val.resize(n + 1), s.resize(n + 1);
for (int i = 1; i <= n; i++) cin >> val[i];
for (int i = 1; i <= n; i++) cin >> s[i];
for (int i = 1; i <= n; i++) tv.push_back(tv.back() + val[s[i]]);
pos.resize(n + 1, -1);
int l = 0, ans = 0, ts = 0, start = 0;
for (int i = 1; i <= n; i++) {
// 当前颜色最近出现的位置小于起点
if (pos[s[i]] < ts
&& (l < i - ts
|| (l == i - ts && ans < tv[i] - tv[ts])
)
) {
l = i - ts;
ans = tv[i] - tv[ts];
start = ts;
}
// 当前颜色最近出现的位置大于起点
if (pos[s[i]] > ts) ts = pos[s[i]];
pos[s[i]] = i;
}
cout << ans << " " << start << " " << start + l - 1 << endl;
return 0;
}
Complexity Analysis
- Time: O ( n ) O(n) O(n)
- Space: O ( n ) O(n) O(n)