BZOJ2388 旅行規劃

2022-05-27 22:39:11 字數 1426 閱讀 3365

n<=1e5個數,m<=1e5個操作:區間加,查區間最大的1~i號點的和。

第一次見到nsqrt(n)logn能過1e5的。。然而跑得很慢

普通資料結構感覺難下手,那就分塊。先處理字首和陣列。一次修改,實際上把一段字首和加上了乙個等差數列,然後把這區間後面的字首和加上某個固定數字,也可以看成另乙個等差數列。等差數列疊加依然是等差數列,那就考慮整塊打上乙個a,b標記表示這一塊加上首項(a+b)公差b的等差數列後的結果。

假設一塊裡的第i個數是si,那如果i比j優(j>i),就有

$s_i+i*b+a>s_j+j*b+a$

整理得$\frac>b$

嘿嘿,每個塊維護個凸包就搞定了

實測塊大小取150跑得比較快。

1 #include2 #include

3 #include4 #include5 #include6

//#include7//

#include

8using

namespace

std;910

intn,m,q;

11#define maxn 100011

12#define maxm 561

13#define ll long long

14int

bel[maxn],tot; ll shou[maxm],cha[maxm],a[maxn],tu[maxm][maxm];

15double calc(int i,int j)

16void maketu(int

x)1725}

26void down(int

x)27

33void modifysingle(int x,int

y,ll s,ll v)

3440

void modify(int x,int

y,ll v)

4149

else

5058

}59 ll querysingle(int x,int

y)60

67 ll query(int x,int

y)68

82 ans=max(ans,a[tu[i][l]]+shou[i]+(tu[i][l]-(i-1)*m)*cha[i]);83}

84 ans=max(ans,querysingle(x,bel[x]*m));

85 ans=max(ans,querysingle((bel[y]-1)*m+1

,y));

86return

ans;87}

88}89int

main()

90109

else

110114

}115

return0;

116 }

view code

BZOJ2388 旅行規劃

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

bzoj2388 旅行規劃

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

BZOJ2388 旅行規劃

bzoj2388 旅行規劃 又是一道氪金題。bzoj 氪金無極限。附上大美洛谷的題面 洛谷p4192 旅行規劃 oivillage是乙個風景秀美的鄉村,為了更好的利用當地的旅遊資源,吸引遊客,推動經濟發展,xkszltl決定修建了一條鐵路將當地n個最著名的經典連線起來,讓遊客可以通過火車從鐵路起點 ...