求助
查看原帖
求助
141599
sinsop90楼主2022/6/6 16:50

我感觉我应该是l或r出了问题

#include <bits/stdc++.h>
#define maxn 100005
using namespace std;
int n, col[maxn], c[maxn], f[maxn], t[maxn], L[maxn], R[maxn], Q[10005][1005], first[maxn];
double Y(int x) {
	return (double)(f[x - 1] + col[x] * c[x] * c[x] - 2 * col[x] * c[x]);
}
double X(int x) {
	return (double)c[x];
}
double slope(int x, int y) {
	if(x == 0 || y == 0) return 0;
	return (double) (Y(y) - Y(x)) / (X(y) - X(x));
}

int main() {
	scanf("%d", &n);
	for(int i = 1;i <= n;i++) {
		scanf("%d", &col[i]);
		c[i] = ++ t[col[i]];
		if(c[i] == 1) first[col[i]] = i;
	}
	for(int i = 1;i <= 10000;i++) L[i] = 1, R[i] = 1, Q[i][1] = first[i];
	for(int i = 1;i <= n;i++) {
		int t = col[i];
		while(L[t] <= R[t] && slope(Q[t][L[t]], Q[t][L[t] + 1]) > 2 * t * c[i]) L[t] ++;
		f[i] = max(f[i], f[Q[t][L[t]] - 1] + t * (c[i] - c[L[t]] + 1) * (c[i] - c[L[t]] + 1));
		while(L[t] <= R[t] && slope(Q[t][R[t] - 1], Q[t][R[t]]) > slope(Q[t][R[t]], i)) R[t] --;
//		cout << f[i] << endl;
		Q[t][++ R[t]] = i;
	}
	cout << f[n] << endl;
}
/*
10
1 5 4 2 3 3 4 2 5 1//hack 应该输出36但是输出了4
*/
2022/6/6 16:50
加载中...