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 #includeview code3 #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 }
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個最著名的經典連線起來,讓遊客可以通過火車從鐵路起點 ...