首页 > 代码库 > BZOJ2216 [Poi2011]Lightning Conductor
BZOJ2216 [Poi2011]Lightning Conductor
Orz ydc:"这题是我见到的第一道非斜率优化的1D1D了……"
话说ydc神犇认为单调队列不是优化咩?、、、已经给跪了
Orz决策单调性
1 /************************************************************** 2 Problem: 2216 3 User: rausen 4 Language: C++ 5 Result: Accepted 6 Time:4128 ms 7 Memory:16432 kb 8 ****************************************************************/ 9 10 #include <cstdio>11 #include <cmath>12 #include <algorithm>13 14 using namespace std;15 typedef double lf;16 const int N = 500005;17 18 struct data {19 int l, r, p;20 data() {}21 data(int _l, int _r, int _p) : l(_l), r(_r), p(_p) {}22 }q[N];23 24 int n, a[N];25 lf f[N], g[N];26 27 inline int read() {28 int x = 0, sgn = 1;29 char ch = getchar();30 while (ch < ‘0‘ || ‘9‘ < ch) {31 if (ch == ‘-‘) sgn = -1;32 ch = getchar();33 }34 while (‘0‘ <= ch && ch <= ‘9‘) {35 x = x * 10 + ch - ‘0‘;36 ch = getchar();37 }38 return sgn * x;39 }40 41 inline lf calc(int j, int i) {42 return a[j] - a[i] + sqrt(abs(i - j));43 }44 45 int find(data t, int x) {46 int l = t.l, r = t.r, mid;47 while (l <= r) { 48 mid = l + r >> 1;49 if (calc(t.p, mid) > calc(x, mid))50 l = mid + 1;51 else r = mid - 1;52 }53 return l;54 }55 56 void dp(lf *F) {57 for (int i = 1, h = 1, t = 0, tmp; i <= n; ++i) {58 ++q[h].l;59 if (h <= t && q[h].r < q[h].l) ++h;60 if (h > t || calc(i, n) > calc(q[t].p, n)) {61 while (h <= t && calc(q[t].p, q[t].l) < calc(i, q[t].l))62 --t;63 if (h > t) q[++t] = data(i, n, i);64 else {65 tmp = find(q[t], i);66 q[t].r = tmp - 1;67 q[++t] = data(tmp, n, i);68 }69 }70 F[i] = calc(q[h].p, i);71 }72 }73 74 int main() {75 int i;76 n = read();77 for (i = 1; i <= n; ++i)78 a[i] = read();79 dp(f);80 reverse(a + 1, a + n + 1);81 dp(g);82 for (i = 1; i <= n; ++i)83 printf("%d\n", (int) ceil(max(f[i], g[n - i + 1])));84 return 0;85 }86
BZOJ2216 [Poi2011]Lightning Conductor
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。