bzoj1597: [Usaco2008 Mar]土地購買(斜率優化+Dp+單調佇列)
題目傳送門
真的舒服我終於第一次自己推出了斜率方程。。
真開心。
解法:
其實這道題Dp還是挺好想的。
Dp方程大概就是f[j]+i到j所有的土地一組的花費。
其實看到斜率優化的題我一般都想怎麼去搞單調性。。
排序。。
先按照長排序一遍。(升降隨意,我從小到大排的)
對於每塊土地i,j<i
那麼i的長肯定大於等於j的長(排了序)
如果i的寬也大於等於j的寬的話,j就沒用了。。
因為它跟i一組就完全沒貢獻啊,所以我們可以把他刪掉。
這樣就會出現。。
前面的土地長都比後面的小。
前面的土地寬都比後面的大。
單調性出來了!!!
所以從j到i分為一組的花費就是j的寬*i的長。
所以Dp方程就為min(f[i],f[j]+a[j+1].r*a[i].l) (l為長,r為寬)
設j<k 且j對於i更優,有方程:
f[j]+a[j+1].r*a[i].l<f[k]+a[k+1].r*a[i].l
(f[k]-f[j])/(a[j+1].r-a[k+1].l)<a[i].l
然後就按照斜率優化去搞唄。
程式碼實現:
#include<cmath>
#include<queue>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
typedef long long ll;
using namespace std;
struct node {
ll l,r;
}a[110000],b[110000];
ll f[110000];
bool cmp(node n1,node n2) {
if(n1.l!=n2.l)
return n1.l<n2.l;
return n1.r<n2.r;
}
double slop(int j,int k) {
return double(f[k]-f[j])/double(b[j+1].r-b[k+1].r);
}
int list[110000],head,tail;
int main() {
int n;scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%lld%lld",&a[i].l,&a[i].r);
sort(a+1,a+1+n,cmp);
int len=0;
for(int i=1;i<=n;i++) {
while(len>0&&b[len].r<=a[i].r)
len--;
len++;b[len]=a[i]; //b為刪除沒用狀態後的所有土地
}
head=1;tail=1;list[1]=0;
for(int i=1;i<=len;i++) {
while(head<tail&&slop(list[head],list[head+1])<b[i].l)
head++;
int t=list[head];
f[i]=f[t]+b[t+1].r*b[i].l;
while(head<tail&&slop(list[tail-1],list[tail])>slop(list[tail],i))
tail--;
list[++tail]=i;
}
printf("%lld\n",f[len]);
return 0;
}
相關文章
- 土地購買
- 多重揹包問題的單調佇列優化佇列優化
- 單調佇列最佳化 DP佇列
- 單調佇列佇列
- 單調棧/單調佇列佇列
- 單調佇列雙端佇列佇列
- 單調棧 和 單調佇列佇列
- 單調棧和單調佇列佇列
- 聯賽模擬測試18 A. 施工 單調佇列(棧)優化DP佇列優化
- 【DP】斜率優化初步優化
- 單調佇列優化dp(五)——#10179. 「一本通 5.5 例 5」Banknotes佇列優化
- [學習筆記] 單調佇列最佳化DP - DP筆記佇列
- 棧,佇列,優先順序佇列簡單介面使用佇列
- 斜率優化DP總結優化
- bzoj 4899 記憶的輪廓 題解(概率dp+決策單調性優化)優化
- 01揹包優先佇列優化佇列優化
- 佇列-單端佇列佇列
- 斜率優化學習筆記優化筆記
- 斜率優化動態規劃優化動態規劃
- 斜率優化(凸包優化)DP問題acm優化ACM
- 【Dijkstra演算法】未優化版+優先佇列優化版演算法優化佇列
- noi.ac #289. 電梯(單調佇列)佇列
- 皮卡購買意向調查
- PHP優先佇列PHP佇列
- 1284 海港 普及組 NOIP2016 佇列基礎 簡單列舉 簡單模擬 優先佇列(priority_queue)佇列
- BZOJ1044: [HAOI2008]木棍分割(dp 單調佇列)佇列
- STL 優先佇列 用法佇列
- 淺談優先佇列佇列
- 堆與優先佇列佇列
- 佇列 優先順序佇列 python 程式碼實現佇列Python
- 三、資料結構演算法-棧、佇列、優先佇列、雙端佇列資料結構演算法佇列
- 效能優化-使用雙buffer實現無鎖佇列優化佇列
- 洛谷題單指南-常見最佳化技巧-P1886 滑動視窗 /【模板】單調佇列佇列
- eMarketer:英、法、德廣告程式化購買支出調查
- RabbitMQ-簡單佇列MQ佇列
- 單向鏈式佇列佇列
- 優先佇列和堆排序佇列排序
- 斜率最佳化 DP
- 斜率最佳化dp