首页 > 其他分享 >洛谷P4983 忘情 题解报告

洛谷P4983 忘情 题解报告

时间:2023-01-19 17:35:11浏览次数:68  
标签:P4983 洛谷 2si int 题解 ll while maxn dp

题目地址

题意:

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

分析:

wqs二分+斜率优化dp。

用单调队列发可以达到\(O(n)\),但注意,为了保证偏序关系,(以我个人代码习惯)当dp[i]有多个转移方向时要尽量选区间数量少的。

当斜率相同时,我让cnt小点的挤兑掉大的点,但这方面多少有点玄学,需要在++l的while式子中,使用<=而不是<

思路

wqs二分+斜率优化dp,复杂度为\(O(nlogn)\)。

代码:

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

struct Dat{
    ll x,y;
    ll cnt;
} q[maxn];
ll dp[maxn];
ll ar[maxn];
int n,m;

int check(ll c)
{
    int l=1,r=1;
    ll s=0;
    //dp[j]+si2-2sisj+2si+sj2-2sj+1, x=sj, y=dp[j]+sj2-2sj, k=2si, b=dp[i]-si2-2si-1
    q[1]={0,0,0};
    for(int i=1;i<=n;++i)
    {
        s+=ar[i];
        ll k=2*s;
        while(l<r && q[l+1].y-q[l].y<=k*(q[l+1].x-q[l].x))
            ++l;
        dp[i]=q[l].y-k*q[l].x+s*s+2*s+1+c;
        ll x=s, y=dp[i]+s*s-2*s;
        while(l<r && (q[r].y-q[r-1].y)*(x-q[r].x)>(y-q[r].y)*(q[r].x-q[r-1].x))
            --r;
        while(l<r && (q[r].y-q[r-1].y)*(x-q[r].x)==(y-q[r].y)*(q[r].x-q[r-1].x) && q[r].cnt<=q[l].cnt+1)
            --r;
        q[++r]={x,y,q[l].cnt+1};
    }
    //cout<<c<<" "<<q[r].cnt<<" "<<dp[n]<<endl;
    return q[r].cnt;
}

int main()
{
    cin.tie(0)->sync_with_stdio(false);
    cin>>n>>m;
    for(int i=1;i<=n;++i)
        cin>>ar[i];
    ll l=-1e15, r=1e15;
    while(r-l!=1)
    {
        ll mid=(l+r)>>1;
        if(check(mid)<m)
            r=mid;
        else
            l=mid;
    }
    check(l);
    cout<<dp[n]-m*l;
}

标签:P4983,洛谷,2si,int,题解,ll,while,maxn,dp
From: https://www.cnblogs.com/blover/p/17061855.html

相关文章

  • abc273G题解
    \(dp[i][j]\):考虑到前i行,有j个2的方案数。设有k个1(计算可得)。\(a_{i+1}=0\):\(dp[i][j]\todp[i+1][j]\)\(a_{i+1}=1\):\(dp[i][j]\times(n-j-k)\todp[......
  • win10下python3.9的代理报错问题解决(附web3的polygon爬虫源码)
    背景因为工作中经常需要代理访问,而开了代理,request就会报错SSLError,如下:requests.exceptions.SSLError:HTTPSConnectionPool(host='test-admin.xxx.cn',port=443):Ma......
  • C# 使用SQLDMO备份数据库时不显示进度的问题解决方法
    在使用SQLDMO备份数据库的过程中,参考了网上的例子,但是进度条却不显示,每次返回的都是0,解决方法是使用全局变量,每次做个累加就可以了。stringServerName="";......
  • Nextcloud安装扩展记录以及问题解决方法
    1、Nextcloud支持显示视频缩略图-23-01-19安装yasm(http://www.tortall.net/projects/yasm/releases/)wgethttp://www.tortall.net/projects/yasm/releases/yasm-1.3.0.......
  • Loj 507 接竹竿 题解
    Loj链接:接竹竿${\scr\color{SkyBlue}{\text{Solution}}}$题目大意:给定一个数组,每次加入一种颜色的数,可以取走与它颜色相同的两个数之间的所有数,问最后取走的所有数......
  • 2023牛客寒假算法基础集训营1-大部分题解
    比赛概况solve:ACDHKLMrank:374/3835dirt:630补题情况EFG题解E:鸡算几何题目链接:https://ac.nowcoder.com/acm/contest/46800/E思路:简单的计算几何叉积运算。我......
  • AT_abc139f 题解
    我们注意向量加法的几何意义。将多个向量向加时,最优的情况是所有边的极坐标单调。但是有一种特殊情况,就是从极角最大的到极角最小的。因此把所有向量极角排序,在做一些处......
  • luogu P1452 题解
    管理备注:虽然此题解为乱搞,但是本乱搞是非常有意义的经典乱搞,故保留在题解区中供学习与参考。我们充分发扬人类智慧:将所有点全部绕原点旋转同一个角度,然后按\(x\)坐标......
  • luogu P8207 题解
    在暴力建边的情况下可以kruskal求生成树。但是这样是\(O(n^2)\)的。因为\(lcm(x,y)=x\timesy/\gcd(x,y)\)。所以\(\gcd(x,y)\)越大我们的答案越优。但是......
  • CF1768C 题解
    考虑构造。首先第一轮构造我们把第一次出现的数放到\(p\)里面,第二次出现的放到\(q\)里面。如果有数第三次出现呢?那么显然无解。那么现在\(p\)和\(q\)中都填了一......