\(n\)個數的乙個序列,給其中的一些數打上標記。
乙個標記方案的貢獻為\(s_1\)表示有多少對\(l,r\)滿足區間\([l,r]\)都被打上了標記,\(s_2\)表示標記的數字和。貢獻為\(s_1-s_2\)
\(m\)次詢問,修改乙個數後,求最大的可能貢獻(詢問之間相互獨立)
\(1\leq n,m\leq 3\times 10^5\)
先把答案減去乙個\(\sum_^na_i\),這樣就變為對於一段\([l,r]\)要麼選擇\(s_1\)要麼選擇\(s_2\)
先考慮不帶修改怎麼搞,設\(f_i\)表示前\(i\)個的最大貢獻。
定義\(s_i=\sum_^ia_i\)然後有方程
\[f_i=max\\}\}
\]這個東西可以斜率優化搞(考場上犯病寫了個\(cdq\),調了我半天)
然後帶修改,考慮到每次只會影響乙個數字,可以理解為乙個字首和字尾拼起來。把剛剛那個\(dp\)再反過來做一次記為\(g_i\)。
那麼現在對於修改的位置\(x\),我們要麼選擇\(x\),要麼跨過\(x\),也就是最大化
\[max\-s_j,f_j+g_i+\binom\}(i\in[0,x-1],j\in[x+1,n+1])
\]前面那個可以把兩個前/字尾的max的\(f_j-s_j\)和\(g_i+s_\)加起來就好了。
後面那個考慮分治,我們每次分治到乙個位置\([l,mid,r]\),如果需要往左走就統計\(i\in[0,l-1]\)和\(j\in[mid+1,r]\)的答案。右邊同理。
因為我們的每次的時間複雜度是外面的大小,所以我們可以維護乙個前字尾的凸殼,然後在上面二分時間複雜度就是\(o(n\log^2 n)\)的。
同時維護兩個凸殼需要回溯所以很麻煩,分開兩次正反做一次就好了。
時間複雜度\(o(n\log^2 n)\)
(考場**,有點醜)
#include#include#include#include#define ll long long
using namespace std;
const ll n=3e5+10,inf=1e18;
ll n,m,ans,lmax,rmax,top,st[n],suf[n];
ll a[n],f[n],g[n],s[n],prt[n],w[n],yf[n];
vectorq[n];
ll px(ll x,ll *f)
ll xj(ll x1,ll y1,ll x2,ll y2)
ll xl(ll a,ll b,ll c,ll *f)
ll ck(ll l,ll r,ll *f)
ll solve(ll l,ll r,ll *f)
for(ll i=mid+1;i<=r;i++)
ll mid=(l+r)>>1,pa=ans;
if(top)
ans=max(ans,cw(st[l],i));
} }calc(l,mid);ans=pa;
calc(mid+1,r);
return;
}void cblc(ll l,ll r)
ll mid=(l+r)>>1,pa=ans;
if(top)
ans=max(ans,cw(i,st[l]));
} }cblc(mid+1,r);ans=pa;
cblc(l,mid);
return;
}signed main()
pre=max(pre,f[i]-s[i]); }
ans=-inf;top=0;
for(ll i=1;i<=n;i++)yf[i]=f[i]*2+i*i+i;calc(0,n+1);
ans=-inf;top=0;
for(ll i=1;i<=n;i++)yf[i]=g[i]*2+(n-i+1)*(n-i+1)+(n-i+1);
cblc(0,n+1);
for(ll i=1;i<=m;i++)
printf("%lld\n",max(prt[i],0ll));
return 0;
}
YbtOJ 最大均值
因此,這個 text 就是所求的最大的平均值 將上個轉化來的問題繼續轉換 既然上個問題中是使平均值不小於 text 那麼如果將 a 序列的所有值都減去 text 那麼問題又變成了 是否存在乙個長度不小於 l 的子段,子段和非負 子段和可以通過字首和相減得到,即設 text i 為 a 1,a i 的...
YbtOJ20029 最大權值
作為今天膜你抄模擬賽上唯一切掉的題目,小w在此氵一篇題解。比賽中的題目,題庫還沒有 有乙個長度為 n 的實數序列,下標從 1 開始,其中第 k 個位置的實數為 p cdot sin a cdot k b cos c cdot d 2 sin 和 cos 採用弧度制,其中 p,a,b,c,d 均為給定...
YbtOj練習 貪心 1最大積分
這道題的題意描述有問題。問題很大,導致我wa了無數次。如果看這句話很容易就會理解錯。在我wa了n次之後看到了這兩個字,哦豁,原來這裡的意思是當你在第i級時,如果買的總件數達到了t i 那麼就可以公升級。includeusing namespace std typedef unsigned long ...