知识点:尺取法
这个题的模型就是给一个序列,求出其中最长的元素不重复的连续子列的长度,只不过在这之上加了一个第二标尺,就是价值,然后就是做题的时候这个价值的下标一定不要搞错,第二行输入的数据就是价值的下标,这点要注意,
所以这个题就可以用尺取法去做了,尺取法的标准的步骤就是4个,移动右坐标,判断退出,更新答案,移动左坐标,但是判断退出和更新答案的顺序是不一定的,这个模型下面我的写法就是先更新答案,然后判断退出,通常退出的条件需要你根据题目给的性质条件自己去想,没有固定的套路,然后这道题就是在更新答案的时候稍微注意一下有第二标尺就行了,
15分钟过了这个题,这道题应该比洛谷上的黄题难一点,
#include <bits/stdc++.h>
using namespace std;
const int N = 1e4 + 5;
int main() {
int n;
cin >> n;
int a[N], b[N];
for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = 1; i <= n; i++) cin >> b[i];
int l = 1, r = 1;
int len = 0;
int val = 0;
int ans = 0, L, R;
map<int, int> mp;
while (true) {
while (r <= n && !mp[b[r]]) {
val += a[b[r]];
mp[b[r++]] = 1;
}
if (r - l > len) {
len = r - l;
ans = val;
L = l - 1;
R = r - 2;
} else if (r - l == len && val > ans) {
ans = val;
L = l - 1;
R = r - 2;
}
if (r == n + 1) break;
while (l <= n && b[l] != b[r]) {
val -= a[b[l]];
mp[b[l++]]--;
}
val -= a[b[l]];
mp[b[l++]]--;
}
cout << ans << " " << L << " " << R;
return 0;
}