我感觉我应该是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
*/