YbtOJ#493-最大分数【斜率优化dp,分治】

正题

题目链接:http://172.17.55.160/contest/117/problem/1


题目大意

nnn个数的一个序列,给其中的一些数打上标记。
一个标记方案的贡献为s1s_1s1表示有多少对L,RL,RL,R满足区间[L,R][L,R][L,R]都被打上了标记,s2s_2s2表示标记的数字和。贡献为s1−s2s_1-s_2s1s2

mmm次询问,修改一个数后,求最大的可能贡献(询问之间相互独立)

1≤n,m≤3×1051\leq n,m\leq 3\times 10^51n,m3×105


解题思路

先把答案减去一个∑i=1nai\sum_{i=1}^na_ii=1nai,这样就变为对于一段[L,R][L,R][L,R]要么选择s1s_1s1要么选择s2s_2s2
先考虑不带修改怎么搞,设fif_ifi表示前iii个的最大贡献。

定义si=∑j=1iais_i=\sum_{j=1}^ia_isi=j=1iai然后有方程
fi=max{fj+max{si−sj,(i−j2)}}f_i=max\{f_j+max\{s_i-s_j,\binom{i-j}{2}\}\}fi=max{fj+max{sisj,(2ij)}}
这个东西可以斜率优化搞(考场上犯病写了个CDQCDQCDQ,调了我半天)

然后带修改,考虑到每次只会影响一个数字,可以理解为一个前缀和后缀拼起来。把刚刚那个dpdpdp再反过来做一次记为gig_igi

那么现在对于修改的位置xxx,我们要么选择xxx,要么跨过xxx,也就是最大化
max{fj+gi+si−1−sj,fj+gi+(i−j−12)}(i∈[0,x−1],j∈[x+1,n+1])max\{f_j+g_i+s_{i-1}-s_j,f_j+g_i+\binom{i-j-1}{2}\}(i\in[0,x-1],j\in[x+1,n+1])max{fj+gi+si1sj,fj+gi+(2ij1)}(i[0,x1],j[x+1,n+1])
前面那个可以把两个前/后缀的max的fj−sjf_j-s_jfjsjgi+si−1g_i+s_{i-1}gi+si1加起来就好了。

后面那个考虑分治,我们每次分治到一个位置[l,mid,r][l,mid,r][l,mid,r],如果需要往左走就统计i∈[0,l−1]i\in[0,l-1]i[0,l1]j∈[mid+1,r]j\in[mid+1,r]j[mid+1,r]的答案。右边同理。

因为我们的每次的时间复杂度是外面的大小,所以我们可以维护一个前后缀的凸壳,然后在上面二分时间复杂度就是O(nlog⁡2n)O(n\log^2 n)O(nlog2n)的。

同时维护两个凸壳需要回溯所以很麻烦,分开两次正反做一次就好了。

时间复杂度O(nlog⁡2n)O(n\log^2 n)O(nlog2n)


code

(考场代码,有点丑)

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#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];
vector<ll > q[N];
ll px(ll x,ll *f)
{return f[x]*2+x*x-x;}
ll xj(ll x1,ll y1,ll x2,ll y2)
{return x1*y2-x2*y1;}
ll xl(ll a,ll b,ll c,ll *f){ll y1=px(b,f)-px(a,f),x1=b-a;ll y2=px(c,f)-px(a,f),x2=c-a;return xj(x1,y1,x2,y2);
}
ll ck(ll l,ll r,ll *f)
{return f[l]+(r-l+1)*(r-l)/2;}
ll solve(ll l,ll r,ll *f){if(l==r)return f[l]-s[l];ll mid=(l+r)>>1;ll maxs=solve(l,mid,f);top=0;for(ll i=l;i<=mid;i++){while(top>1&&xl(st[top-1],st[top],i,f)>=0)top--;st[++top]=i;}for(ll i=mid+1;i<=r;i++){while(top>1&&ck(st[top],i,f)<ck(st[top-1],i,f))top--;f[i]=max(f[i],max(ck(st[top],i,f),s[i]+maxs));}maxs=max(maxs,solve(mid+1,r,f));return maxs;
}
ll cw(ll l,ll r)
{return f[l]+g[r]+(r-l-1)*(r-l)/2;}
ll xll(ll a,ll b,ll c){ll y1=(yf[b]-yf[a])*2,x1=b-a;ll y2=(yf[c]-yf[a])*2,x2=c-a;return xj(x1,y1,x2,y2);
}
ll xlr(ll a,ll b,ll c){ll y1=yf[b]-yf[a],x1=(n-b+1)-(n-a+1);ll y2=yf[c]-yf[a],x2=(n-c+1)-(n-a+1);return xj(x1,y1,x2,y2);
}
void calc(ll L,ll R){if(L==R){for(ll i=0;i<q[L].size();i++){ll x=q[L][i],tmp;prt[x]=max(ans-w[x]+a[L]-s[n],prt[x]);}while(top>1&&xll(st[top-1],st[top],L)>=0)top--;st[++top]=L;return;}ll mid=(L+R)>>1,pa=ans;if(top){for(ll i=mid+1;i<=R;i++){ll l=1,r=top-1;while(l<=r){ll x=(l+r)>>1;if(cw(st[x],i)<=cw(st[x+1],i))l=x+1;else r=x-1;}ans=max(ans,cw(st[l],i));}}calc(L,mid);ans=pa;calc(mid+1,R);return;
}
void cblc(ll L,ll R){if(L==R){for(ll i=0;i<q[L].size();i++){ll x=q[L][i],tmp;prt[x]=max(ans-w[x]+a[L]-s[n],prt[x]);}while(top>1&&xlr(st[top-1],st[top],L)>=0)top--;st[++top]=L;return;}ll mid=(L+R)>>1,pa=ans;if(top){for(ll i=L;i<=mid;i++){ll l=1,r=top-1;while(l<=r){ll x=(l+r)>>1;if(cw(i,st[x])<=cw(i,st[x+1]))l=x+1;else r=x-1;}ans=max(ans,cw(i,st[l]));}}cblc(mid+1,R);ans=pa;cblc(L,mid);return;
}
signed main()
{freopen("score.in","r",stdin);freopen("score.out","w",stdout);scanf("%lld",&n);for(ll i=1;i<=n;i++)scanf("%lld",&a[n-i+1]);for(ll i=1;i<=n;i++)s[i]=s[i-1]+a[i];solve(0,n,g);for(ll i=1;i<n-i+1;i++)swap(a[i],a[n-i+1]),swap(g[i],g[n-i+1]);for(ll i=1;i<=n;i++)s[i]=s[i-1]+a[i];solve(0,n,f);scanf("%lld",&m);for(ll i=1;i<=m;i++){ll x;scanf("%lld%lld",&x,&w[i]);q[x].push_back(i);}suf[n+2]=-inf;for(ll i=n+1;i>=1;i--)suf[i]=max(suf[i+1],g[i]+s[i-1]);for(ll i=0,pre=-inf;i<=n;i++){for(ll j=0;j<q[i].size();j++){ll x=q[i][j];prt[x]=suf[i+1]+pre-s[n];}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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/319427.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大鱼吃小鱼

题目大意 给你若干数&#xff0c;让你分成若干组&#xff0c;每组两个&#xff0c;如果一组数中大的数大于等于小的数的两倍&#xff0c;那么有一点贡献&#xff0c;问贡献最大是多少 解题思路 先排序&#xff0c;然后分为大小两组&#xff0c;双指针看可以合多少组 code #i…

2018CCPC吉林赛区(重现赛)补题部分——F线段树待补

A - The Fool 数论分块暴力求和 #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optimize(2) #include<set> #include<map> #include<cmath> #include<queue> #include<string> #include<vector> #include&…

【dfs】年会小游戏

题目大意 给出n&#xff0c;问小于n的数中&#xff0c;因数最多的数 解题思路 要满足因数最多&#xff0c;则小的质因数个数要大于等于打的质因数个数 那么直接按这个需求dfs枚举每个质因数的指数 code #include<cstdio> #include<cstring> #include<iostre…

在 ASP.NET Core 中集成 Skywalking APM

前言大家好&#xff0c;今天给大家介绍一下如何在 ASP.NET Core 项目中集成 Skywalking&#xff0c;Skywalking 是 Apache 基金会下面的一个开源 APM 项目&#xff0c;有些同学可能会 APM 是干什么用的还不是太了解&#xff0c;那么下面我就简单的来说一下。APM 全称是 &#x…

YbtOJ-大收藏家【分层图,最大流】

正题 题目链接:https://www.ybtoj.com.cn/contest/117/problem/2 题目大意 nnn个人&#xff0c;每人有aia_iai​个属于自己的物品。mmm次交换依次进行&#xff0c;每次xi,yix_i,y_ixi​,yi​两个人可以决定拿不拿自己的一个物品进行交换。 求111号人最后能拿到最多多少种物品…

2019中国大学生程序设计竞赛(CCPC) - 网络选拔赛 Fishing Master

文章目录题意&#xff1a;题解&#xff1a;代码&#xff1a;题意&#xff1a; 你在钓鱼&#xff0c;每次钓鱼固定时间为k&#xff08;必定钓上一条鱼&#xff09;&#xff0c;池塘一共n条鱼&#xff0c;钓上鱼后要煮&#xff0c;每条鱼煮的时间不相同&#xff0c;可以在煮鱼的…

NWERC 2018——B.Brexit Negotiations

Brexit Negotiations 有向无环图&#xff0c;很容易想到拓扑排序&#xff0c;很明显我们需要把权值大的点放在最前面&#xff0c;然后就想到搞个优先队列&#xff0c;每次拓扑排序的时候出权值大的点&#xff0c;但是发现答案是不对的。 正向建图拓扑排序能够保证小的点一定最后…

.NET运行时中的监测和可观测性

今年5月份的时候研究分布式追踪的问题知道了的拦截方式比较零散&#xff0c; 刚好8月份的时候看到这篇文章&#xff0c;这个文章总结的比较完整。存档了很久&#xff0c;趁今天有空翻译给大家。原文地址&#xff0c;校验&#xff1a;张蘅水.NET是一个托管运行时&#xff0c;这意…

YbtOJ#532-往事之树【广义SAM,线段树合并】

正题 题目链接:https://www.ybtoj.com.cn/problem/532 题目大意 给出nnn个点的一个TrieTrieTrie树&#xff0c;定义SxS_xSx​表示节点xxx代表的字符串 求max{∣LCP(Sx,Sy)∣∣LCS(Sx,Sy)∣}(x≠y)max\{|LCP(S_x,S_y)||LCS(S_x,S_y)|\}(x\neq y)max{∣LCP(Sx​,Sy​)∣∣LCS(S…

【并查集】公司搬迁

题目大意 给出n,a,b和n个数&#xff0c;有两个集合A,B&#xff0c;如果x放在A中则a-x必须存在且在A中&#xff0c;B同理&#xff0c;问你是否有合法方案 解题思路 不难发现&#xff0c;如果a-x或b-x存在&#xff0c;那么和x必须在同一个集合&#xff08;若x放A中b-x放B中则不…

牛客练习赛 71 AC

A - 回文数 回文数条件&#xff1a;奇数个数的个数最多有一个 如果0的数量是0&#xff0c;那么直接先找到奇数个数的数是谁&#xff0c;然后正序输出一半逆序输出一半即可。 如果0的数量不是0&#xff0c;只需要找到一个偶数个个数的数放置第一个即可&#xff08;只需要放一个…

开源文件服务器file-service介绍

File-service一个基于ASP.NET Core的可伸缩、通用的文件服务器。通常后端项目可能会有头像、图片、音频、视频等上传/下载需求&#xff0c;这些需求都可以抽象为文件服务。功能特点支持Linux&#xff08;推荐&#xff09;、Windows可伸缩式架构&#xff0c;支持部署1-N台文件服…

【二分】走亲戚

题目大意 平面上有n个点&#xff0c;给出m个询问&#xff0c;每个询问要回答从x轮流往右往左去到最远的点&#xff0c;最后到达的点 解题思路 对于每个询问&#xff0c;每次二分左右可以到多远&#xff0c;直到不能动为止 考虑时间&#xff0c;对于重复走一个范围的&#xf…

CF1375F-Integer Game【交互】

正题 题目链接:https://www.luogu.com.cn/problem/CF1375F 题目大意 给出a,b,ca,b,ca,b,c。先手每次指定一个数kkk&#xff0c;然后后手指定一个数字加上kkk&#xff0c;若有相同的数则先手胜利&#xff0c;操作次数超过100010001000后后手胜。后手不能两次操作同一个数。 你…

Stars(树状数组)

题意&#xff1a; m个星星&#xff0c;一个星星的等级取决于有多少其他星星的横纵坐标不大于它&#xff0c;如果有x个&#xff0c;该星星等级为x 问各个等级的星星有多少个&#xff1f; &#xff08;题目会按照y的升序给出星星坐标&#xff09; 题解&#xff1a; 树状数组入…

AtCoder Regular Contest 105 部分 NIM游戏

TESyyds&#xff0c;本来以为又要3:1&#xff0c;结果创造历史&#xff01;&#xff01;&#xff01;非常激动啊好久好久没看过让二追三了。 无缝衔接回旋踢&#xff0c;qa插眼we。送给雷达哥 A - Fourtune Cookies 签到题 #define IO ios::sync_with_stdio(false);cin.tie(…

【状压DP】作业

题目大意 有n个数&#xff0c;让你对其排列&#xff0c;令排列后的第i个数字为sis_isi​&#xff0c;该排列要满足&#xff1a; ∀i∈[1,n),si≤si1\forall i\in [1,n),s_i\leq s_{i1}∀i∈[1,n),si​≤si1​∀i∈[1,n),∣(min(si,si1),max(si,si1))∩{sj∣k>i}∣≤bi\fora…

Lost Cows(树状数组)

试题链接 题意&#xff1a; 求出一个&#xff11;到&#xff4e;的排列&#xff0c;这个排列只告诉了你从第二个数字开始的比这个数字小的数的个数。 题解&#xff1a; 如果一个数p&#xff0c;p的前面有m个比他小的数&#xff0c;后面有n个比他小的数&#xff0c;那p的位置…

P2611-[ZJOI2012]小蓝的好友【Treap,扫描线】

正题 题目链接:https://www.luogu.com.cn/problem/P2611 题目大意 r∗cr*cr∗c的网格上有nnn个标记点&#xff0c;然后求有多少个矩形包含至少一个标记点。 1≤r,c≤4104,1≤n≤1051\leq r,c\leq 4\times 10^4,1\leq n\leq 10^51≤r,c≤4104,1≤n≤105 保证数据随机 解题思路…