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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

COGS-363-土地购买-斜率优化

發(fā)布時間:2025/3/15 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 COGS-363-土地购买-斜率优化 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

描述

  • 有 n(≤50000) 塊 (Xi*Yi) 的土地. 一些土地的購買價格是這些土地中長的最大值乘寬的最大值 (長寬不可顛倒). 求購買所有土地的最小花費.
  • 將 n 個二元組 (x, y) 分組使每個組中的 max{x}*max{y} 的和最小.

分析

  • 這里土地的順序是無所謂的, 所以憑直覺先按 x 升序排序.
  • 然后去除無用的土地, 即如果一塊土地可以完全包含在另一塊土地里, 這一塊土地就不需要再考慮了(因為它可以和后者分在一組). 這一步可以用一個單調(diào)棧來實現(xiàn).

  • 這時 x 遞增, y 遞減.

  • 得到轉(zhuǎn)移方程 : 由 j->i(j < i), f[i]=f[j?1]+Xi?Yj
  • 意義就在于 j 和 i 之間的土地的長不大于 Xi 而寬不大于 Yj.
  • O(n2)

  • 斜率優(yōu)化 :
  • 如果 j < k, j 不比 k 差, 則 f[j?1]+Xi?Yjf[k?1]+Xi?Yk
  • 化簡得到 Xif[k?1]?f[j?1]Yj?Yk
  • 設上式 f[k?1]?f[j?1]Yj?Yk=g(j,k)
  • 則如果 g(a,b)>g(b,c) 則 b 可以完全被舍棄. 證明如下
    • 如果 g(a,b)Xi, 那么 a 優(yōu)于 b.
    • 如果 g(a,b)<Xi, 那么 g(b,c)<Xi c 優(yōu)于 b.
  • 所以可以用一個單調(diào)隊列來存儲當前在考慮范圍內(nèi)的土地. 用隊尾的兩個結(jié)點和 i 的 XY 的值來維護單調(diào)隊列. 其實是判定隊尾結(jié)點可不可以刪除.
  • 而在更新 f[i] 的答案時, 則從隊頭選取. 如果 g(q[first],q[first+1])Xi 說明隊首元素是隊列中的最優(yōu)解(向后推就可以證明了). 否則 first 就應該從隊列中刪除, 因為此時 q[first+1]q[first] 優(yōu), 在 i 變大時 Xi 也變大, 那么 g(q[first],q[first+1])<Xi 是一定成立的.
  • O(n?logn)

代碼

https://code.csdn.net/snippets/647122

#include <cstdio> #include <algorithm> using namespace std;const int maxn = 50000 + 10;inline int getint() {int x = 0, f = 1;char ch = getchar();for(; ch < '0' || ch > '9'; ch = getchar()) if(ch == '-') f = -1;for(; ch >= '0' && ch <= '9'; ch = getchar()) x = x*10 + ch-'0';return x * f; }struct Node {int x, y;bool operator < (const Node& rhs) const {if(x == rhs.x) return y < rhs.y;return x < rhs.x;} } A[maxn];int q[maxn]; long long f[maxn];double g(int a, int b) {return (double)(f[b-1]-f[a-1]) / (A[a].y-A[b].y); }int main() {freopen("acquire.in", "r", stdin);freopen("acquire.out", "w", stdout);int n = getint(), m;for(int i = 0; i < n; i++) {A[i].x = getint();A[i].y = getint();}sort(A, A + n);m = 0;for(int i = 0; i < n; i++) {while(m > 0 && A[m-1].y <= A[i].y) m--;A[m++] = A[i];}int first, last;first = last = 0;for(int i = 0; i < m; i++) {while(last-first > 1 && g(q[last-2], q[last-1]) > g(q[last-1], i)) last--;q[last++] = i;while(last-first > 1 && g(q[first], q[first+1]) < (double)A[i].x) first++;int j = q[first];f[i] = (long long)A[i].x * A[j].y + (j > 0 ? f[j-1] : 0);}printf("%lld\n", f[m-1]);return 0; }

總結(jié)

以上是生活随笔為你收集整理的COGS-363-土地购买-斜率优化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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