首页 > 代码库 > HDU 5009 Paint Pearls _(:зゝ∠)_2014 ACM/ICPC Asia Regional Xi'an Online
HDU 5009 Paint Pearls _(:зゝ∠)_2014 ACM/ICPC Asia Regional Xi'an Online
呵呵
#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; }
HDU 5009 Paint Pearls _(:зゝ∠)_2014 ACM/ICPC Asia Regional Xi'an Online
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。