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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JZOJ 5415. 【NOIP2017提高A组集训10.22】公交运输

發(fā)布時間:2025/3/15 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JZOJ 5415. 【NOIP2017提高A组集训10.22】公交运输 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Description

城市中有一條長度為n的道路,每隔1的長度有一個公交車站,編號從0到n,學(xué)校在0號車站的位置。其中每個公交車站(除了n號車站)有兩個屬性ci和vi,代表從這個公交車站出發(fā)的公交車的性質(zhì)。ci代表這個從i出發(fā)的公交車,相鄰兩個停靠站之間的距離。vi表示每坐1站的花費。
注意,一輛公交車出發(fā)后會向n號車站的方向行進(jìn)。同時,一名乘客只能從起點站上車,但可以從任意停靠站下車。校慶志愿者小Z為了幫助校友查詢有關(guān)城市交通費用的問題,想知道從0號車站(也就是學(xué)校)出發(fā),到達(dá)每個公交車站的最小花費,于是他找到了你。

Input

輸入的第一行有兩個整數(shù),n和maxc。
之后的n行,每行兩個整數(shù),分別表示0到n-1號車站的c和v.

Output

輸出一行n個整數(shù),其中第i個整數(shù)代表從0號車站到i號車站的最小花費,若不能從0號車站到達(dá)i號車站,則在i號車站的位置輸出-1。

Sample Input

輸入1:

1 1
1 1

輸入2:

9 5
2 5
5 2
5 14
1 18
4 13
3 17
1 16
1 7
5 4

Sample Output

輸出1:

1

輸出2:

-1 5 -1 10 -1 15 19 20 33

Data Constraint

對于30%的數(shù)據(jù)滿足,1<=n<=5000
對于60%的數(shù)據(jù)滿足,1<=n<=10^5
對于另20%的數(shù)據(jù)滿足,maxc=1
對于100%的數(shù)據(jù)滿足,1<=n<=10^6,1<=maxc<=10,1<=ci<=maxc,1<=vi<=1000
數(shù)據(jù)存在梯度。

Hint

樣例1說明:從0號車站坐1站地,到達(dá)1號車站,花費為1,可以發(fā)現(xiàn)這是從0號車站到1號車站的最小花費。

Solution

  • 設(shè) F[i] 表示第 i 個點的最優(yōu)答案,那么顯然可以想到:F[i]=min{F[j]+i?jc[j]?v[j]}

  • 但是這樣DP的時間復(fù)雜度是 O(N2) ,顯然不能AC。

  • 看到后面的一串表達(dá)式像斜率的形式,但是由于轉(zhuǎn)移距離 c[j] 的限制不能直接斜率優(yōu)化。

  • 于是我們想到分類討論:按照 c 的值和 i mod c 的值維護(hù) maxc?maxc 一個上凸包,

  • 用單調(diào)棧存儲即可。時間復(fù)雜度為 O(N)

Code

#include<cstdio> #include<vector> using namespace std; const int N=1e6+1,inf=1e9; vector<int>s[11][10]; int f[N],c[N],v[N]; inline int read() {int X=0,w=1; char ch=0;while(ch<'0' || ch>'9') {if(ch=='-') w=-1;ch=getchar();}while(ch>='0' && ch<='9') X=(X<<3)+(X<<1)+ch-'0',ch=getchar();return X*w; } inline void write(int x) {if(x<0) putchar('-'),x=-x;if(x>9) write(x/10);putchar(x%10+'0'); } inline int min(int x,int y) {return x<y?x:y; } inline double get(int x,int y) {if(v[x]==v[y]) return inf;return (double)(f[x]-f[y]-v[x]*(x/c[x])+v[y]*(y/c[y]))/(v[y]-v[x]); } inline int calc(int x,int y) {return f[y]+(x-y)/c[y]*v[y]; } int main() {int n=read(),mc=read();for(int i=1;i<=n;i++) c[i-1]=read(),v[i-1]=read(),f[i]=inf;for(int i=0;i<n;i++){int x=c[i],y=i%c[i];while(!s[x][y].empty() && v[i]<=v[s[x][y][s[x][y].size()-1]]) s[x][y].pop_back();while(s[x][y].size()>1 &&get(i,s[x][y][s[x][y].size()-1])>=get(s[x][y][s[x][y].size()-2],s[x][y][s[x][y].size()-1])) s[x][y].pop_back();s[x][y].push_back(i);for(int j=1;j<=mc;j++){y=(i+1)%j;while(s[j][y].size()>1 &&calc(i+1,s[j][y][s[j][y].size()-1])>=calc(i+1,s[j][y][s[j][y].size()-2])) s[j][y].pop_back();if(!s[j][y].empty()) f[i+1]=min(f[i+1],calc(i+1,s[j][y][s[j][y].size()-1]));}}for(int i=1;i<=n;i++) write(f[i]==inf?-1:f[i]),putchar(' ');return 0; }

總結(jié)

以上是生活随笔為你收集整理的JZOJ 5415. 【NOIP2017提高A组集训10.22】公交运输的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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