首页 > 其他分享 >洛谷P3628 特别行动队 题解报告

洛谷P3628 特别行动队 题解报告

时间:2023-01-17 17:36:11浏览次数:65  
标签:洛谷 int 题解 ll 斜率 maxn 行动队 sum dp

题目地址

题意:

把正整数序列分隔为若干区间,若单个区间的元素之和为X,则其贡献为\(aX^2+bX+c\)。求所有区间的贡献之和的最大值。

分析:

斜率优化dp模板题。

这篇博客描述得很清晰(但是推出的式子不等号方向弄反了)。

整理不等式,得到斜率表达式。每到一个 i 时,可以立即获取当前的切线斜率k(假定k恒负)。对于由两个候选点连成的直线而且,设斜率为w,若w>k,则后者更优,否则前者更优。从暴力的角度讲,我们可以这样去找到目标转移点:两两枚举点,把被淘汰的一方标记,最后没被标记的点就是解。

然而对每个 i 都这样做显然复杂度不理想,于是我们先作分析,得出结论(过程自行了解):最优点一定落在最外围的凸包上。这里k为恒负,所有应该是上凸。如果一个点不在凸包上,那么无论k为何值,都一定会被淘汰。对这个凸包,我们考虑横坐标相邻的点就行了,对于不相邻的点之间连的直线,在这两点间的相邻点连线中肯定有的斜率比它高和比它低(拉格朗日中值定理)。
上凸或下凸,跟题目要最大还是最小有关,与k的正负无直接关系。找到最优点 j 后,按朴素dp式从dp[j]转移到dp[i]即可。

除了根据优劣关系筛最优点外,另一种等价思想是:将原式整理作b=max/min(y+kx),b中包含了dp[i]和其他定值,y中包含了只与j有关的值,k与i有关,x与j有关。于是问题变为找到一点(x,y),在给定的k下,截距最大/最小,那么显然直线应该切在凸包上。最后由b得到dp[i]。更详细的描述可见这篇博客,个人更喜欢这个思考方向。

思路

用斜率为负的直线切上凸包,以求得截距最大。凸包上相邻两点直线的斜率递减,可以二分查找,复杂度为\(O(nlogn)\)

由于斜率随 i 递增,每个元素至多入队一次出队一次,可用单调队列优化至\(O(n)\)。

代码:

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int maxn = 1e6+5;

struct Pos{
    ll x,y;
} q[maxn];
ll sum[maxn];
ll dp[maxn];

int main()
{
    cin.tie(0)->sync_with_stdio(false);
    int n;
    ll a,b,c;
    cin>>n>>a>>b>>c;
    int l=1,r=1; //闭区间,至少有两个元素在内
    q[1]={0,0}; //朴素dp是可以从0位置转移的,在斜率优化中也要按X,Y的定义如实加入起点
    for(int i=1;i<=n;++i)
    {
        ll t;
        cin>>t;
        sum[i]=sum[i-1]+t;
        ll k=2*a*sum[i];
        while(r>l && k*(q[l+1].x-q[l].x)<q[l+1].y-q[l].y) //用乘法比较斜率(这里是最尾点与其下一个点)(不用拆括号,保证无除法即可)
            ++l;
        dp[i]=q[l].y-k*q[l].x+a*sum[i]*sum[i]+b*sum[i]+c; //B=Y-KX,再从B中得到dp[i]
        //dp[i]=q[l].f+a*(sum[i]-q[l].x)*(sum[i]-q[l].x)+b*(sum[i]-q[l].x)+c; //另一种思想,表达式等价
        Pos p;
        p.x=sum[i], p.y=dp[i]+a*sum[i]*sum[i]-b*sum[i];
        while(r>l && (p.y-q[r].y)*(q[r].x-q[r-1].x)>(q[r].y-q[r-1].y)*(p.x-q[r].x))
            --r;
        q[++r]=p;
    }
    cout<<dp[n];
}

标签:洛谷,int,题解,ll,斜率,maxn,行动队,sum,dp
From: https://www.cnblogs.com/blover/p/17058362.html

相关文章

  • 洛谷 P1098 [NOIP2007 提高组] 字符串的展开
    洛谷链接牛客链接两个平台都过了题目:题解:本题是一道比较硬核的模拟题,思路方面其实问题不大,但是难在模拟情况上面而且测试数据里还包含了一些题目中没有提到的情况,所......
  • 1.17模拟赛题解
    T1设\(dp_{i,j}\)前\(i+j\)个人站队,第一排站\(i\)个人的方案数。每次对相同身高的一段人进行转移。暴力复杂度是正确的。时间复杂度\(O(n^2)\)。T4考虑二分答......
  • iSCSI的客户端messages频繁报错问题解决
    问题现象:在自己的工作站中安装的RAC测试环境,使用了iSCSI模拟共享存储,环境运行OK,但是在messages信息中频繁报错如下:[root@db01rac2~]#tail-20f/var/log/messagesJan......
  • 送礼物题解
    题目描述达达帮翰翰给女生送礼物,翰翰一共准备了N个礼物,其中第i个礼物的重量是G[i]。达达的力气很大,他一次可以搬动重量之和不超过W的任意多个物品。达达希望一次搬......
  • 清单计价-2022鹏业云计价i20常见问题解答整理
    1、如何批量将EXCEL报表的工程结构、清单和定额一次性导入计价软件?答:通过云计价i20软件的“导入Excel新建”功能,可以将招标控制价、投标报价等多种类型的表格一次性导入软件......
  • CF1748B题解
    题目传送门简要题意给定一个长度为\(n\)的只由数字\(0\)到\(9\)组成的字符串\(s\),求\(s\)中有多少个子串满足所有数字出现次数的最大值小于等于出现的不同数......
  • THUCTF MISC题解
    永不停歇的Flag生产机这是一台永不停歇的Flag生产机,它会生产出许许多多的Flag供你挑选和使用,就连这道题的Flag也是由这台生产机制造出来的。哦放心,我知道你想......
  • CF 1779C Least Prefix Sum 题解
    CF链接:LeastPrefixSumLuogu链接:Least PrefixSum${\scr\color{CornflowerBlue}{\text{Solution}}}$先来解释一下题意:给定一个数组,问最少把多少个数变成相反数,......
  • 洛谷P1496 火烧赤壁【题解】
    事先声明本题解文字比较多,较为详细,算法为离散化和差分,如会的大佬可以移步去别处看这道题的思路(因为作者比较懒,不想新开两个专题)。题目简要给定每个起火部分的起点和终点......
  • 【问题解决】Tomcat启动服务时提示Filter初始化或销毁出现java.lang.AbstractMethodEr
    问题背景最近在开发项目接口,基于SpringBoot2.6.8,最终部署到外置Tomcat8.5.85下,开发过程中写了一个CookieFilter,实现javax.servlet.Filter接口,代码编译期正常。部署到外......