BZOJ P1044[HAOI2008]木棍分割

来源:互联网 发布:支付宝超强助手源码 编辑:程序博客网 时间:2024/05/15 20:47

第一问二分答案+判断

第二问DP发现空间时间双超

然后下面是优化

空间:直接滚存即可

时间:发现转移的一段是连续的区间,直接单调队列优化 降到O(MN)因为每一个元素只可能入队和出队一次

#include<iostream>#include<cstdio>#include<algorithm>#include<cmath>using namespace std;const int zyy=10007;int f[2][50003];int s[50003];int n,m,ans1;bool check(int x){    int num=0,nown=0;    for(int i=1;i<=n;i++){        if(s[i]>x){        return false;}        nown+=s[i];if(nown>x){nown=s[i];num++;}    }    if(nown>0){    num++;}    return num<=m;}int main(){    cin>>n>>m;    m++;    for(int i=1;i<=n;i++){    cin>>s[i];}    int l=1,r=1e9,mid;    while(l<=r){        mid=(l+r)>>1;        if(check(mid)){        ans1=mid;r=mid-1;}else{l=mid+1;}    }    f[0][0]=1;f[1][0]=1;    for(int i=1;i<=n;i++){    s[i]+=s[i-1];}    int pre=0,nown=1;    for(int j=1;j<=m;j++,pre=nown,nown^=1){    for(int i=1,tot=0,l=1,r=0;i<=n;i++){        tot=(tot+f[pre][r++])%zyy;        while(l<=r&&s[r]-s[l-1]>ans1){        tot=(tot-f[pre][l-1]+zyy)%zyy;++l;}        f[nown][i]=tot;    }}cout<<ans1<<" "<<f[pre][n]<<endl;    return 0;}/*in:3 21110out:10 2*/


1 0
原创粉丝点击