題意
oivillage 是乙個風景秀美的鄉村,為了更好的利用當地的旅遊資源,吸引遊客,推動經濟發展,xkszltl 決定修建了一條鐵路將當地 n
nn 個最著名的經典連線起來,讓遊客可以通過火車從鐵路起點( 1
11 號景點)出發,依次遊覽每個景區。為了更好的評價這條鐵路,xkszltl 為每乙個景區都賦予了乙個美觀度,而一條旅行路徑的價值就是它所經過的景區的美觀度之和。不過,隨著天氣與季節的變化,某些景點的美觀度也會發生變化。
xkszltl 希望為每位旅客提供最佳的旅行指導,但是由於遊客的時間有限,不一定能遊覽全部景區,然而他們也不希望旅途過於短暫,所以每個遊客都希望能在某乙個區間內的車站結束旅程,而 xkszltl 的任務就是為他們選擇乙個終點使得旅行線路的價值最大。可是當地的景點與前來觀光的旅客實在是太多了,xkszltl 無法及時完成任務,於是找到了準備虐殺 noi2019 的你,希望你能幫助他完成這個艱鉅的任務。
題解考慮分塊凸包
設 s
is_i
si 表示i的字首和, d
jd_j
dj 表示 j
jj 這個區間的每個數都加上它, f
jf_j
fj 表示每位置的字首和都加上它
對於第 j
jj 塊的區間 [l,
r]
[l,r]
[l,r
] 考慮它的 ans
ansansan
s=ma
xi=l
rfj+
dj×(
i−l)
+s
ians=max_^ f_j+d_j \times (i-l)+s_i
ans=ma
xi=l
rfj
+dj
×(i
−l)+
si設 x=i
−l
x=i-l
x=i−
l , y=s
iy=s_i
y=si
,把式子化簡成 y=−
dj×x
+ans
−f
jy=-d_j \times x+ans-f_j
y=−dj
×x+a
ns−f
j故維護上凸殼即可
#include #define i inline
#define db double
#define ll long long
using namespace std;
const int n=1e5+5,m=350;
ll s[n],f[m],d[m],c[m];
int m,n,b,b[n],l[m],r[m],z,s[m],p[m][m],sz[m];
i db k(int x,int y)
i void u(int x)
i ll a(int x)
}i ll q(int l,int r)
int main()r[z=b[n]]=n;
for (int i=1;i<=z;i++) u(i);
scanf("%d",&m);ll x;
for (int op,l,r;m--;)
return 0;
}
旅行規劃問題
問題描述 g 先生想獨自駕駛汽車從城市a 到城市b。從城市a 到城市b 的距離為d0 公里。汽車油箱的容量為c 公升。每公升汽油能行駛e 公里。出發點每公升汽油的 為p 元。從城市a到城市b 沿途有n 個加油站。第i 個加油站距出發點的距離為di,油價為每公升pi元。如何規劃才能使旅行的費用最省。程...
旅行規劃問題(貪心)
g 先生想獨自駕駛汽車從城市a到城市b。ab距離為dist 千公尺,油箱容量為c公升,每公升油行駛d千公尺,沿途有n個加油站,距a城的距離為si,油價分別為pi。a點時,郵箱為空,起點油價為p。求從a到b的最少費用。不能到達輸出 no solution 輸入 dsit c d p n 接下來n行輸入...
BZOJ2388 旅行規劃
分塊,每一塊維護字首和,觀察發現,一次區間加操作對於 l 前,r後的區間裡相對的大小關係沒有影響,對於 l r 裡,將每個位置放在平面內作為乙個點 i si 那麼相當於給區間裡加了乙個斜率。每個塊維護乙個凸包 上凸下凸應該都可以,下文以上凸為例 如果這個塊被完整覆蓋,就打個斜率的標記,否則暴力重構凸...