bzoj 3675: [Apio2014]序列分割
生活随笔
收集整理的這篇文章主要介紹了
bzoj 3675: [Apio2014]序列分割
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
(一開始決策單調性證錯了。。(蛋疼)(其實是沒有單調性的,怎么都一樣),可以自己寫一寫i<j,先分i后分j,和先分j后分i是一樣的)
(而且犇蒟蒻發現斜率優化隨便推上一個式子就可以了,(感覺比DP簡單多了(霧)))
1 #include<cstdio> 2 #include<iostream> 3 #define LL long long 4 #define lowbit(x) x&(-x) 5 #define inf 0x3f3f3f3f 6 #define eps 1e-5 7 #define N 100005 8 using namespace std; 9 inline int ra() 10 { 11 int x=0,f=1; char ch=getchar(); 12 while (ch<'0' || ch>'9') {if (ch=='-') f=-1; ch=getchar();} 13 while (ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();} 14 return x*f; 15 } 16 LL f[N][2],sum[N],ans,a[N]; 17 int q[N],n,K,top,pp,qq; 18 double slope(int b, int a) 19 { 20 return (double)(sum[b]*sum[b]-f[b][pp]+f[a][pp]-sum[a]*sum[a])/(double)(sum[b]-sum[a]); 21 } 22 int main(int argc, char const *argv[]) 23 { 24 n=ra(); K=ra(); 25 for (int i=1; i<=n; i++) a[i]=ra(); 26 for (int i=1; i<=n; i++) if (a[i]!=0) sum[++top]=sum[top-1]+a[i]; 27 n=top; pp=1,qq=0; 28 for (int k=1; k<=K; k++) 29 { 30 int L=1,R=0; 31 for (int i=k; i<=n; i++) 32 { 33 while (L<R && slope(i-1,q[R])<slope(q[R],q[R-1])) R--; 34 q[++R]=i-1; 35 while (L<R && slope(q[L+1],q[L])<sum[i]) L++; 36 int t=q[L]; 37 f[i][qq]=f[t][pp]+(sum[i]-sum[t])*sum[t]; 38 } 39 pp^=1,qq^=1; 40 } 41 cout<<f[n][pp]; 42 return 0; 43 }?
轉載于:https://www.cnblogs.com/ccd2333/p/6544984.html
總結
以上是生活随笔為你收集整理的bzoj 3675: [Apio2014]序列分割的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Javascript 构造函数模式、原型
- 下一篇: 50:树中两个结点的最低公共祖先