BZOJ 5424 燒橋計畫 單調佇列

2022-04-10 03:36:07 字數 1700 閱讀 9775

題目鏈結

先考慮最暴力的\(dp\):設\(f[k][i]\)表示搞掉第\(1\sim i\)段,燒了\(k\)段的最小花費,設\(calc(x,y)=sum[x\sim y]\le m?0:sum[x\sim y]\),可以列出轉移方程如下

\[f[k][i]=min(f[k-1][j]+calc(j+1,i))+k*a[i] (j

這樣時間複雜度是\(o(n^3)\)的,十分**

考慮優化

首先發現題目中給出的\(1000 \le a[i]\le 2000\)。仔細想想,這表明\(k\)值最大不會太大

設最壞情況下取了\(k\),則此時一定是滿足\(k*(k+1)/2*1000\le n*2000\)的

(就是說不是你把\(n\)段橋都斷了也比\(k\)段優)

這樣算下來\(n\)最大的時候\(k\)也就是\(600\)的樣子,\(o(n*k)\)就可以過了

但現在時間複雜度還是\(o(n^2k)\)的,考慮對於每個\(k\)的每個\(i\),如何快速計算此時的\(f[k][i]\)

這個時候就可以用單調佇列優化了。

設當前是\(f[k][i]\),題目中\(m\)的限制(就是那個\(calc(x,y)\))就相當於把\(1\sim i\)段分成了兩部分:

前半部分要計算中間的\(sum[x\sim y]\),後半部分不用

那麼對於前半部分記乙個最小值,後半部分維護遞增的單調佇列,\(dp\)時取兩個最小的那個就可以做到\(o(1)\)轉移了

細節不少,剛開始寫感覺很迷,寫著寫著也就想明白了吧

注意\(k\)是沒有單調性的,一定從\(1\)到\(t\)全列舉一遍

和\(sxz\)一起卡了波時間,驚奇地發現\(k\)最大居然只有\(152\)

(別問為什麼這麼準,二分試出來的)

#include#include#include#include#include#include#include#include#include#define qmax(x,y) (x=max(x,y))

#define qmin(x,y) (x=min(x,y))

#define mp(x,y) make_pair(x,y)

using namespace std;

typedef long long ll;

typedef pairpii;

inline int read()

while(ch>='0'&&ch<='9')

ans=ans*10+ch-'0',ch=getchar();

return ans*fh;

}const int maxn=1e5+100;

int n,m,mx,q[maxn],p[maxn],l,r,a[maxn],f[2][maxn];

int tot,mn,sum[maxn],ans=0x7fffffff;

int main()

if(l<=r) qmin(now,p[l]);

qmin(now,mn+tot);

f[o][i]=(now+=k*a[i]);

while(l<=r&&p[r]>=f[o^1][i]) r--;

p[++r]=f[o^1][i],q[r]=i;

tot+=a[i];

} qmin(ans,f[o][n]);

} printf("%d\n",ans);

return 0;

}

USACO 5 4 2 以後在理解

這道題的意思是到現在理解的不太透徹,以後需要在看,先把 貼上吧 id m1500293 lang c prog charrec include include include using namespace std const char letter 30 abcdefghijklmnopqrstu...

html5 4 2 video元素的屬性

支援的瀏覽器有 firefox opera chrome 支援的瀏覽器有 ie9 chrome safari 雖然目前應用較廣,單有專利保護,是收費在 支援的瀏覽器有 chrome opera safari video元素的屬性 屬性屬性值 描述src urlwidth 正整數 百分比 height...

5 42如何高效的學習開源專案

date comments categories br title 2020 4 18 true 軟體架構 架構 開源專案 5.42 如何高效學習開源專案 工作當中會經常使用到開源專案,例如nginx,redis,netty等。對於開源專案,不能只知其然,還要知道其所以然。這樣做的目的,一方面是為了...