p5017 擺渡車
這道題的做法很多,我考慮用斜率優化的方法來做
先定義\(f[i]\)表示運走\(i\)時間之前的人,並且必須在\(i\)這個時間發車的最小代價
。很顯然\(f[i]=min(f[j]+\sum_^i(i-t_k))\)
我們考慮用乙個類似字首和的東西預處理出\(\sum_^i(i-t_k)\)
用\(g[i]\)記錄\(i\)時間前有幾個人,用\(s[i]\)記錄\(i\)時間前的人的\(t_i\)和
於是\(\sum_^i(i-t_k)=(g[i]-g[j]) \ast i-(s[i]-s[j])\)
這裡要注意\((j+1)+m<=i\)
於是推一下式子
\[f[i]=f[j]+\sum_^i(i-t_k)
\]\[f[i]=f[j]+(g[i]-g[j]) \ast i-(s[i]-s[j])
\]\[i \ast g[j] +f[i]+s[i]+i \ast g[i]=f[j]+s[j]
\]這裡\(k=i\),\(x=g[j]\),\(b=f[i]+s[i]+i \ast g[i]\),\(y=f[j]+s[j]\)
然後發現是有決策單調性的,於是用單調佇列優化就好了。
要注意,要先對\(f[i](0≤i<m)\)預處理,\(f[i]=g[i]\ast i-s[i]\),就是前面的人都要上車
#includeusing namespace std;
const int maxn=4e6+105,inf=1<<30;
int n,m,max_t,g[maxn],s[maxn],f[maxn],hed=1,til=0,q[maxn],ans=inf;
inline int read()
while(ch<='9'&&ch>='0')ret=ret*10+ch-'0',ch=getchar();
return ret*f;
}inline int x(int j)
inline int y(int j)
inline long double calc(int i,int j)
int main()
for(int i=1;i=calc(q[til-1],i-m+1))--til;
q[++til]=i-m+1;
} for(int i=max_t;iprintf("%d\n",ans);
return 0;
}
洛谷P5017擺渡車
題目 一道做法多種多樣的題,dp做法的狀態也很多。我用 dp i 表示在第i秒發車的時間和,然後dp方程就很好寫了 dp i dp j i車的等待時間 j屬於i 2m i m。然後i車的等待時間可以用字首和來優化求出,雖然很慢,但是足以通過這道題了。include include include i...
NOIP2018 普及組 擺渡車 題解
關於我上冬令營網課時,聽說普及組考過斜率優化dp這件事 擺渡車往返一次要 m 分鐘,但擺渡車可以在起點等人,故可以將往返一次的時間 t in m,infty 但是個人都不會讓他等於正無窮吧?求這 n 個人等待時間之和最小值。首先,觀察資料範圍 小資料就不說了吧 顯然,可以根據時間設定狀態。設 f 表...
題解 P1011 車站
posted on 2019 08 20 22 07 29 蒟蒻的第一篇題解 教你怎樣打表 這一道題目其實是個數學題,也不是很難,我們可以先在草稿紙上寫一下 用 x,y 代表a和b的係數12 3456 上車u 1,0 0,1 1,1 1,2 2,3 3,5 下車d 0,0 0,1 0,1 1,1 1...