日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

BZOJ2216 [Poi2011]Lightning Conductor 【决策单调性dp】

發(fā)布時間:2023/12/20 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BZOJ2216 [Poi2011]Lightning Conductor 【决策单调性dp】 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目鏈接

BZOJ2216

題解

學過高中數(shù)學都應知道,我們要求\(p\)的極值,參變分離為
\[h_j + sqrt{|i - j|} - h_i \le p\]
實際上就是求\(h_j + sqrt{|i - j|} - h_i\)的最大值
就可以設\(f[i]\)表示對\(i\)最大的該式的值
絕對值通常要去掉,一般可以通過方向性,我們只需每次轉移時令\(i > j\),正反轉移兩次即可
現(xiàn)在式子變?yōu)?br />\[f[i] = max\{h_j + \sqrt{i - j}\} - h_i\]
發(fā)現(xiàn)\(\sqrt{i - j}\)依舊無法處理,無法展開使用我們喜聞樂見的斜率優(yōu)化

此時就可以考慮這個式子是否具有決策單調性
我們考慮對于\(i'<i\),我們的決策為\(h_j + sqrt{i' - j}\)
那么對于\(forall k < j\)\(h_k + sqrt{i' - k} < h_j + sqrt{i' - j}\)
現(xiàn)在我們用\(i\)替換\(i'\)
式子變?yōu)?span id="ozvdkddzhkzd" class="math inline">\(h_k + sqrt{i - k}\)和\(h_j + sqrt{i - j}\)
\(h_k\)\(h_j\)是沒有變化的,如果\(sqrt{i - j}\)的增長比\(sqrt{i - k}\)的增長要快,我們就可認定\(i\)替換\(i'\)后,\(k\)依舊無法作為最優(yōu)決策
考慮函數(shù)
\[f(x) = \sqrt{x}\]
\[f'(x) = \frac{1}{2\sqrt{x}}\]
顯然當\(x\)越大增長率越慢,而\(i' - k > i' - j\)\(\sqrt{i - j}\)的增長的確比\(\sqrt{i - k}\)的增長要快
得證

所以用隊列維護三元組優(yōu)化即可
復雜度\(O(nlogn)\)

#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<map> #define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt) #define REP(i,n) for (int i = 1; i <= (n); i++) #define mp(a,b) make_pair<int,int>(a,b) #define cls(s) memset(s,0,sizeof(s)) #define cp pair<int,int> #define LL long long int using namespace std; const int maxn = 500005,maxm = 100005; inline int read(){int out = 0,flag = 1; char c = getchar();while (c < 48 || c > 57){if (c == '-') flag = -1; c = getchar();}while (c >= 48 && c <= 57){out = (out << 3) + (out << 1) + c - 48; c = getchar();}return out * flag; } double f[maxn],h[maxn]; int n,head,tail,ans[maxn]; struct tri{int l,r,pos;}q[maxn << 1]; inline double cal(int i,int j){return h[j] + sqrt(i - j) - h[i]; } inline bool check(int pos,int i,int j){return cal(pos,i) >= cal(pos,j); } void work(){q[head = tail = 0] = (tri){1,n,1};tri u;for (int i = 1; i <= n; i++){ans[i] = max(ans[i],(int)ceil(cal(i,q[head].pos)));q[head].l++;if (q[head].l > q[head].r) head++;while (head <= tail){u = q[tail--];if (!check(u.r,i,u.pos)){q[++tail] = u;if (u.r + 1 <= n) q[++tail] = (tri){u.r + 1,n,i};break;}if (check(u.l,i,u.pos)){if (head > tail){q[++tail] = (tri){i + 1,n,i};break;}continue;}else {int l = u.l,r = u.r,mid;while (l < r){mid = l + r >> 1;if (check(mid,i,u.pos)) r = mid;else l = mid + 1;}q[++tail] = (tri){u.l,l - 1,u.pos};q[++tail] = (tri){l,n,i};break;}}} } int main(){n = read();for (int i = 1; i <= n; i++) h[i] = read();work();reverse(h + 1,h + 1 + n);reverse(ans + 1,ans + 1 + n);work();for (int i = n; i; i--)printf("%d\n",ans[i]);return 0; }

轉載于:https://www.cnblogs.com/Mychael/p/9210591.html

總結

以上是生活随笔為你收集整理的BZOJ2216 [Poi2011]Lightning Conductor 【决策单调性dp】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。