BZOJ2388 旅行規劃

2022-03-29 16:02:02 字數 2441 閱讀 9964

bzoj2388: 旅行規劃

又是一道氪金題。。。

$bzoj$氪金無極限。。。

附上大美洛谷的題面:

洛谷p4192 旅行規劃

oivillage是乙個風景秀美的鄉村,為了更好的利用當地的旅遊資源,吸引遊客,推動經濟發展,xkszltl決定修建了一條鐵路將當地n個最著名的經典連線起來,讓遊客可以通過火車從鐵路起點(1號景點)出發,依次遊覽每個景區。

為了更好的評價這條鐵路,xkszltl為每乙個景區都哦賦予了乙個美觀度,而一條旅行路徑的價值就是它所經過的景區的美觀度之和。

不過,隨著天氣與季節的變化,某些景點的美觀度也會發生變化。

xkszltl希望為每位旅客提供最佳的旅行指導,但是由於遊客的時間有限,不一定能遊覽全部景區,然而他們也不希望旅途過於短暫,所以每個遊客都希望能在某乙個區間內的車站結束旅程,而xkszltl的任務就是為他們選擇乙個終點使得旅行線路的價值最大。

可是當地的景點與前來觀光的旅客實在是太多了,xkszltl無法及時完成任務,於是找到了準備虐殺noi2011的你,希望你能幫助他完成這個艱鉅的任務。

輸入格式:

第一行給出乙個整數n,接下來一行給出n的景區的初始美觀度。

第三行給出乙個整數m,接下來m行每行為一條指令:

0 x y k:表示將x到y這段鐵路邊上的景區的美觀度加上k;

1 x y:表示有一名旅客想要在x到y這段(含x與y)中的某一站下車,你需要告訴他最大的旅行價值。

輸出格式:

對於每個詢問,輸出乙個整數表示最大的旅行價值。

輸入樣例: 

5

1 8 -8 3 -7

31 1 5

0 1 3 6

1 2 4

輸出樣例: 

9

22

對於100%的資料,n,m≤100000。

題意就是求從$1$開始,到$[x,y]$之間某個點結束的字首和最大的那個值,帶修改。

那個修改先丟一邊去。

有乙個不容易想到的轉化:

如果我們把下標看做橫座標,字首和看做縱座標,那答案肯定是在凸包的最高點上。

所以關鍵在於動態維護凸包。

我們有許多極好的資料結構可以動態維護凸包:$treap$,李超樹,$set$,等等。

但是這裡我們選擇了分塊+二分維護。

為什麼使用複雜度更高的演算法呢?

因為我們維護的是字首和及其修改。

如果是原序列,區間加就直接打個標記就好。

但是現在是字首和。

於是區間加就變成了區間加首項為$k$、公差為$k$的等差數列。

但是多次修改呢?

沒事,我們有高中必修:

$$\text\+\text\=\text\$$

所以直接合併等差數列就好。

對於每個塊,我們維護等差數列首項$first$、公差$d$以及乙個$add$標記。

於是每個位置的真實值就是:$$\text+\text+\text\times(\text-\text)+add$$

但是注意,我們維護的是字首和。

所以當我們在$[l,r]$上區間加時,對於$r$之後的那些塊,我們都要打上$add$標記。

而且在處理$r$所屬塊時,要先把區間加對在$r$之後的$r$所屬塊中元素的影響考慮完,才能對$r$所屬塊維護凸包。

複雜度$o(n\sqrt n\log_2 n)$。

記得開$long\ long$。

附**:

#include#include#include#include#define maxn 100010

#define maxm 320

#define max (1ll<<61)

using namespace std;

int n,m,block;

int colour[maxn],left[maxm],right[maxm],num[maxm],convex[maxm][maxm];

int top,stack[maxm];

long long val[maxn],add[maxm],first[maxm],d[maxm];//first item,tolerance

inline int read()

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

return date*w;

}inline double slope(int x,int y)

void build(int x)

} return -max;

}long long solve(int l,int r)

return ans;

}void work()

else printf("%lld\n",solve(x,y)); }}

void init()

for(int i=1;i<=colour[n];i++)build(i);

m=read();

}int main()

BZOJ2388 旅行規劃

分塊,每一塊維護字首和,觀察發現,一次區間加操作對於 l 前,r後的區間裡相對的大小關係沒有影響,對於 l r 裡,將每個位置放在平面內作為乙個點 i si 那麼相當於給區間裡加了乙個斜率。每個塊維護乙個凸包 上凸下凸應該都可以,下文以上凸為例 如果這個塊被完整覆蓋,就打個斜率的標記,否則暴力重構凸...

bzoj2388 旅行規劃

凸包好題 我一開始想的是線段樹或平衡樹維護最大字首和,但是區間修改很噁心,後來想分塊,發現貌似可以做,修改的話,中間的塊打標記,兩邊的暴力重構,查詢的話就是整塊二分斜率為零的地方,邊上的暴力查詢。o nsqrt n log n 1 include 2 include 3 include 4 incl...

BZOJ2388 旅行規劃

bzoj2388 旅行規劃 試題描述 oivillage是乙個風景秀美的鄉村,為了更好的利用當地的旅遊資源,吸引遊客,推動經濟發展,xkszltl決定修建了一條鐵路將當地n個最著名的經典連線起來,讓遊客可以通過火車從鐵路起點 1號景點 出發,依次遊覽每個景區。為了更好的評價這條鐵路,xkszltl為...