fl[i]表示[1,i]操作一次,且在[j+1,i]處操作的最大值
1:把[j+1,i]改為b[i]:
max(sum[j]+b[i]*(i-j))
=b[i]*i+max(-j*b[i]+sum[j])(0<=j由於j遞增,-j遞減,所以從右往左建立凸殼,查詢時在凸殼上二分查詢即可,時間複雜度$o(n\log n)$。
2:把[j+1,i]改為b[j]:
max(sum[j]+b[j+1]*(i-j))
=max(b[j+1]*i+sum[j]-b[j+1]*j)(0<=j考慮分治,對[l,mid]按b[j+1]從小到大排序,然後斜率優化即可,時間複雜度$o(n\log^2n)$。
將a,b序列翻轉,即可求出fr[i]。
ans=max(fl[i]-sum[i]+fr[j]+sum[j-1])(0<=i=max(fr[j]+sum[j-1]+max(fl[i]-sum[i]))
維護字首最大的fl[i]-sum[i]即可。
#include#include#define n 500010
typedef long long ll;
int n,i,j,a[n],b[n],c[n],e[n],q[n],h,t;ll sum[n],d[n],f[n],fl[n],fr[n],pre,ans;
inline void read(int&a)
inline double pos(int x,int y)
inline ll ask(int x)
return sum[q[fin]]-(ll)q[fin]*x;
}inline void up(ll&x,ll y)
for(i=mid+1;i<=r;i++)
for(i=0;isolve(0,n);
}int main()
return printf("%lld",ans),0;
}
cyk的時間表
problem description 從前有座山,山理 有座廟,廟裡有個 cyk 和 blue blue 天天纏著 cyk cyk 天天躲著 blue 對於 cyk 的高冷,blue 只能從 cyk 的日常活動入手,於是他找來了 cyk 手機上的日常活動安排,發現 cyk 每天必做 n 件事,但是...
程式語言cyk的時間表
time limit 1000ms memory limit 65536kb submit statistic problem description 從前有座山,山理 有座廟,廟裡有個 cyk 和 blue blue 天天纏著 cyk cyk 天天躲著 blue 對於 cyk 的高冷,blue 只...
好老公的作息時間表
6 30 起床 起床之後,一定要吻一下正在熟睡的老婆的臉,但動作要輕,不得吵醒老婆 6 35 7 00 煅煉身體 在老婆要抱的時候,可以輕易抱上七樓 在老婆受到欺負的時候 可以以一敵十 7 00 7 30 做早餐 花樣一定要多,麵包 牛奶 雞蛋,豆漿 油條 公尺粉,包子 饅頭 稀飯,不得有重複 7 ...