社区讨论

最后一个点蜜汁WA?!

P3648[APIO2014] 序列分割参与者 5已保存回复 9

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
9 条
当前快照
1 份
快照标识符
@mi7xq3n0
此快照首次捕获于
2025/11/21 05:20
4 个月前
此快照最后确认于
2025/11/21 05:20
4 个月前
查看原帖
RT,不知道为什么最后一个点一直WAWAWAWA。。。。于是求助大佬
最后一个点的测评信息:
CPP
wrong answer contestant didn't find the optimal answer: 124309619349406840 < 124309619349406845 得分0

Code:

CPP
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#define S(x) ((x)*(x))
using namespace std;

const int N=1e5+2;
const double eps=1e-8;
int n,k,head,tail,pre[N][205];
long long s[N],f[N],g[N],q[N];

template <typename _Tp> inline void IN(_Tp&x) {
    char ch;bool flag=0;x=0;
    while(ch=getchar(),!isdigit(ch)) if(ch=='-') flag=1;
    while(isdigit(ch)) x=x*10+ch-'0',ch=getchar();
    if(flag) x=-x;
}

double X(int i) {return s[i];}
double Y(int i) {return g[i]-S(s[i]);}
double slope(int i,int j) {
    if(s[i]==s[j]) return eps;
    return 1.0*(Y(i)-Y(j))/(X(j)-X(i));
}
inline void calc(int i,int j) {
    f[i]=g[j]+s[j]*(s[i]-s[j]);
}

int main() {
    // freopen("P3648.in","r",stdin);
    // freopen("P3648.out","w",stdout);
    IN(n),IN(k);
    for(int i=1;i<=n;++i) IN(s[i]),s[i]+=s[i-1];
    for(int j=1;j<=k;++j) {
        q[head=tail=1]=0;
        for(int i=1;i<=n;++i) {
            while(head<tail&&slope(q[head],q[head+1])<=s[i]) ++head;
            calc(i,q[head]),pre[i][j]=q[head];
            while(head<tail&&slope(q[tail],i)<=slope(q[tail],q[tail-1])) --tail;
            q[++tail]=i;
        }
        memcpy(g,f,sizeof(f));
    }
    printf("%lld\n",f[n]);
    for(int x=n,i=k;i>=1;--i)  
        x=pre[x][i],printf("%d%c",x," \n"[i==1]);
    return 0;
}

回复

9 条回复,欢迎继续交流。

正在加载回复...