好了我摆烂了

P3648 [APIO2014] 序列分割

您其实可以封装一下求斜率的部分的 于己于人都有好处![](//图.tk/i)
by fanypcd @ 2022-06-15 23:01:24


您这样写极有可能出错![](//图.tk/n)
by fanypcd @ 2022-06-15 23:01:50


嗯,好的 但是好像这样写也没有错……?
by Danno0v0 @ 2022-06-15 23:02:46


@[Danno0v0](/user/167279) 我在尽量不改变您的原代码的基础上改了一份可以 AC 的,您可以参考一下。 ```cpp #include<bits/stdc++.h> #define int long long using namespace std; int Sum[1000001],n,k; int deq[1000001],h,t; int dp[1000001][2]; int f[300001][301]; #define X(x) (Sum[x]) #define Y(x) (dp[x][0] - Sum[x] * Sum[x]) #define calc(x, y) make_pair(Y(y) - Y(x), X(y) - X(x)) bool cmp(pair<int, int> a, pair<int, int> b) {return a.first * b.second < b.first * a.second;} void print(int i, int j) { if(f[i][j]) print(f[i][j], j - 1); printf("%d ", i); return; } signed main() { cin>>n>>k; for(int i=1;i<=n;i++) { cin>>Sum[i]; Sum[i]+=Sum[i-1]; } for(int ChainsawKiller=1;ChainsawKiller<=k;ChainsawKiller++) { memset(deq,0,sizeof(deq)); deq[1]=0,h=t=1; for(int i=1;i<=n;i++) { while(h<t&&!cmp(calc(deq[h], deq[h + 1]), make_pair(-Sum[i], 1))) h++; dp[i][1]=dp[deq[h]][0]+(Sum[i]-Sum[deq[h]])*Sum[deq[h]]; f[i][ChainsawKiller]=deq[h]; while(h<t&&cmp(calc(deq[t - 1], deq[t]), calc(deq[t], i))) t--; deq[++t]=i; } for(int i=1;i<=n;i++) dp[i][0]=dp[i][1]; } cout<<dp[n][1]<<endl; print(f[n][k], k - 1); } /* 199890017 299840021 */ ```
by fanypcd @ 2022-06-15 23:23:32


@[Danno0v0](/user/167279) 还有您最后的输出方案似乎是反的,不知道您怎么过的样例![](//图.tk/r)
by fanypcd @ 2022-06-15 23:24:49


我睡觉去了,有事明天早上再回![](//图.tk/n)
by fanypcd @ 2022-06-15 23:26:11


@[违规用户名pbFH$J9W](/user/90027) 非常感谢 貌似好像是入队斜率写错了(( 另外方案输出因为顺序无关所以怎么输都可以吧 总之谢谢
by Danno0v0 @ 2022-06-15 23:50:02


|