新人求助,WA很多点很难受。
  • 板块P4983 忘情
  • 楼主Sharpsmile
  • 当前回复1
  • 已保存回复1
  • 发布时间2023/3/15 16:35
  • 上次更新2023/10/23 21:29:51
查看原帖
新人求助,WA很多点很难受。
455490
Sharpsmile楼主2023/3/15 16:35

rt,只过掉了 m=2m=2 和最后两个点。

不知道是wqs寄了还是斜率优化寄掉了。

求大佬帮帮

//#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <math.h>
#include <algorithm>
#include <istream>
#include <string>
#include <queue>
#include <deque>
#include <stack>
#include <set>
#include <string.h>
#include <map>
#include <unordered_map>
#include <random>
#include <bitset>
#define int long long
#define double long double
#define p1(x) x.first
#define p2(x) x.second
#define i128  __int128_t
#define endl "\n"
//#pragma GCC optimize(2)
#define w(x) w[x]
//#define siz(x) t[x].siz
#define lc(x) (x<<1)
#define rc(x) (x<<1|1)
#define pii pair<int,int>
//若汁记好了以后再用Ctrl+C/+V你就是狗
using namespace std;
bool FSTRD;
char buf[1<<20],*p1,*p2;
inline char gc(){
    if(!FSTRD){
        char x;
        cin>>x;
        return x;
    }
    if(p1==p2)
        p2=(p1=buf)+fread(buf,1,1<<20,stdin);
    if(p1==p2)return EOF;
    return *p1++;
}
inline int rd(){
    if(!FSTRD){
        int x;
        cin>>x;
        return x;
    }
    int p=1;
    int x=0,w=gc();
    while(w<'0'||w>'9'){
        if(w=='-')p=-1;
        w=gc();
    }
    while(w>='0'&&w<='9')x=x*10+w-'0',w=gc();
    return x*p;
}
inline void rd(vector<int*>T){
    for(auto x:T)
        *x=rd();
}
int n,m;
int s[100300];
struct node{
    int x,y,s;
    friend node operator-(const node A,const node B){
        return {A.x-B.x,A.y-B.y};
    }
    friend i128 operator *(const node A,const node B){
        return (i128)A.x*B.y-A.y*B.x;
    }
    inline double sl(){
        return 1.l*y/x;
    }
}T[100300];
deque<int>q;
inline void ins(int x){
    while(q.size()>=2&&(
          (T[x]-T[q.size()-2]).sl()
          <
          (T[q.back()]-T[q.size()-2]).sl()
          ||
            (
             
             (T[x]-T[q.size()-2]).sl()
             ==
             (T[q.back()]-T[q.size()-2]).sl()
             
             &&
             
             T[q.back()].s<=T[x].s
             )
          )
        )q.pop_back();
    q.push_back(x);
}
inline int g(int k){
    while(q.size()>=2&&(
                         (T[q[1]]-T[q[0]]).sl()<k
                        ||
                            (
                             (T[q[1]]-T[q[0]]).sl()==k
                             &&
                             T[q[1]].s>=T[q[0]].s
                             )
                        )
          )
        q.pop_front();
    return q.front();
}
pii dp[100300];
inline pii calc(int p){
    memset(dp,0x3f,sizeof(dp));
    dp[0]={0,0};
    q.clear();
    T[0]={0,0};
    ins(0);
    for(int i=1;i<=n;i++){
        int k=2*(s[i]+1);
        int j=g(k);
//        cout<<j<<" ";
//        cout<<q.back()<<" ";
        dp[i]={p1(dp[j])
            +s[j]*s[j]
            +(s[i]+1)*(s[i]+1)
            -2*(s[i]+1)*s[j]
            +p,
            p2(dp[j])+1
            };
        T[i]={s[i],p1(dp[i])+s[i]*s[i],p2(dp[i])};
        //cout<<T[i].x<<" "<<T[i].y<<endl;
        ins(i);
    }
//    cout<<endl;
    return dp[n];
}
signed main(){
    ios::sync_with_stdio(0);
//  freopen("","r",stdin);
//  freopen("","w",stdout);
//   FSTRD=1;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        cin>>s[i],s[i]+=s[i-1];
    int l=0,r=1e16;
    int res=0;
    while(l<r){
        int mid=(l+r)>>1;
        if(p2(calc(mid))>=m)res=mid,l=mid+1;
        else r=mid-1;
    }
//    cout<<l<<endl;
    pii A=calc(res);
    
    cout<<p1(A)-m*res<<endl;
    return 0;
}
/*
 */
2023/3/15 16:35
加载中...