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)中的某一站下車,你需要告訴他最大的旅行價值。
輸出格式:
對於每個詢問,輸出乙個整數表示最大的旅行價值。
輸入樣例:
51 8 -8 3 -7
31 1 5
0 1 3 6
1 2 4
輸出樣例:
922
對於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為...