第一道顶级,这个题目的模型是找一个最大的没有重复元素的区间,然后还有一个第二标尺那就是尽可能价值最大,这个不是很难,最重要是怎么找这个最大的区间要想明白,用的同向扫描的尺取法,这里我的思路就是先移动右边界,然后看右边界的是不是重复出现过了,分成这两种讨论,
#include <bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define all(x) (x).begin(), (x).end()
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef pair<int, int> pa;
const int maxn = 1e4 + 5;
int w[maxn], a[maxn], rec[maxn];
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> w[i];
}
for (int i = 0; i < n; i++) {
cin >> a[i];
}
int l = 0, r = 0;
rec[a[l]] = 1;
int tmp_max = 1;
int val = w[a[l]];
int max_val = val;
int ans_l = 0, ans_r = 0;
while (r < n - 1) {
r++;
if (rec[a[r]]) {
while (l < r) {
val -= w[a[l]];
rec[a[l]] = 0;
l++;
if (a[l - 1] == a[r]) break;
}
rec[a[r]] = 1;
val += w[a[r]];
} else {
rec[a[r]] = 1;
val += w[a[r]];
}
if (r - l + 1 > tmp_max) {
tmp_max = r - l + 1;
max_val = val;
ans_l = l, ans_r = r;
} else if (r - l + 1 == tmp_max && val > max_val) {
max_val = val;
ans_l = l, ans_r = r;
}
}
cout << max_val << " " << ans_l << " " << ans_r;
return 0;
}