社区讨论
最后一个点蜜汁WA?!
P3648[APIO2014] 序列分割参与者 5已保存回复 9
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 9 条
- 当前快照
- 1 份
- 快照标识符
- @mi7xq3n0
- 此快照首次捕获于
- 2025/11/21 05:20 4 个月前
- 此快照最后确认于
- 2025/11/21 05:20 4 个月前
RT,不知道为什么最后一个点一直WAWAWAWA。。。。于是求助大佬
最后一个点的测评信息:
CPPwrong 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 条回复,欢迎继续交流。
正在加载回复...