HDU 5009 Paint Pearls _ (: Getting started soon) _ 2014 ACM/ICPC Asia Regional si'an Online, hduicpc
Haha
#include <cstdio>#include <algorithm>#include <iostream>#include <cstring>typedef long long ll;using namespace std;const int N = 5 * 10000 + 5;int xval[N], dep;int n, a[N], pre[N];ll d[N];int pos[300], dd;void work() {dep = dd = 0;for (int i = 1; i <= n; ++i) {scanf("%d", &a[i]);if (i > 1 && a[i] == a[i - 1]) {-- i;-- n;continue;}xval[dep++] = a[i];}sort(xval, xval + dep);dep = unique(xval, xval + dep) - xval;for (int i = 1; i <= n; ++i)a[i] = lower_bound(xval, xval + dep, a[i]) - xval;d[0] = 0;memset(pre, -1, sizeof pre);for (int i = 1; i <= n; ++i) {d[i] = i;bool done = false;for (int j = dd; j >= 1; --j)if (a[pos[j]] == a[i]) {for (int k = j; k >= 2; --k)pos[k] = pos[k - 1];pos[1] = i;done = true;break;}if (!done) {for (int j = dd + 1; j >= 2; --j)pos[j] = pos[j - 1];pos[1] = i;if (++dd > 250)dd = 250;}for (int j = 1; j <= dd && (j - 1) * (j - 1) <= i; ++j) {d[i] = min(d[i], d[pos[j]] + (j - 1) * (j - 1));}d[i] = min(d[i], (ll)dd * dd);pre[a[i]] = i;}printf("%I64d\n", d[n]);}int main() {while (~scanf("%d", &n))work();return 0;}