AtCoder Beginner Contest 240 F
ABC 240
F
思路
维护前缀和B,以及B的前缀和C,然后在每次添加连续y个x的时候,从中找出最大的(用pre记录),更新答案。
有四种情况
那么新出现的中的最大值就在最后一个元素
新出现的中最大值即
如果画个图出来,C就是个开口向上的二次函数,两个端点取max
这个不用变,加了就变小不如不加
代码
void solve()
{
cin>>n>>m;
int b=0,c=0,ans=-1e18,pre=0;
for(int i=1;i<=n;i++)
{
int x,y;
cin>>x>>y;
if(i==1)//特判一下,因为不知道怎么设初值
{
if(x>=0) ans=x*y*(y+1)/2;
else ans=x;
c+=b*y+(y+1)*y/2*x;
b+=x*y;
continue;
}
if(b>=0)
{
if(x>=0) pre =c+b*y+(y+1)*y/2*x;
else
{
int k=min(y,-b/x);
pre=c+b*k+(k+1)*k/2*x;
}
}
else pre=max(c,c+b*y+(y+1)*y/2*x);
ans=max(ans,pre);
c+=b*y+(y+1)*y/2*x;
b+=x*y;
}
cout<<ans<<endl;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)