题目大意

网址:https://daniu.luogu.org/problemnew/show/P2511
题目大意:
有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处.
现在允许你最多砍断m个连接处,砍完后n根木棍被分成了很多段,
要求满足总长度最大的一段长度最小, 并且输出有多少种砍的方法使得总长度最大的一段长度最小.
数据范围: \(n<=50000, 0<=m<=min(n-1,1000)\).

题目解法

第一问弱智题,直接二分即.
第二问考虑DP。 显然f[i][j]表示到了第i根木棍,已经切了j次的方案数。
那么找到i木棍最远可延展距离lev[i]。显然转移为:
\[f[i][j] = ∑f[v][j-1],(Lg[v,i]<=Res)\]
但是这样子显然空间开不下。
观察到j的转移只于j-1有关,可以压掉j。然后考虑如何优化时间复杂度。
显然f[i][j]求和是可以线性记录的。令:
\[g[i][j-1] = g[i-1][j-1] +∑f[v][j-1],(Lg[v,i]<=Res)\]
那么每次转移时,一边转移f,一边修改g,这样就可以实现\(O(1)\)转移了。
最终的空间复杂度为\(O(N)\),时间复杂度为\(O(N*M)\)。

具体代码

#include<bits/stdc++.h>
#define RG register
#define IL inline
#define maxn 100005
#define mod 10007
using namespace std;

int Res,N,M,Ans,Lg[maxn],lev[maxn],f[maxn][3],g[maxn][3];

IL bool Check(RG int x){
    RG int d = 0,cnt = 0;
    for(RG int i = 1; i <= N; i ++){
        if(Lg[i] > x)return false;
        if(d + Lg[i] > x){d = Lg[i]; cnt++;}
        else d += Lg[i];
    }
    return cnt <= M;
}

int main()
{
    cin>>N>>M;
    for(RG int i = 1; i <= N; i ++)cin>>Lg[i];
    int L = 0,R = 2000000000; Res = -1;
    while(L<=R){
        RG int mid = (L+R)>>1;
        if(Check(mid)){Res = mid; R = mid - 1;}
        else L = mid + 1;
    }
    for(RG int i = 1; i <= N; i ++)Lg[i] += Lg[i-1];
    L = 1;
    for(RG int R = 1; R <= N; R ++)
        {while(Lg[R] - Lg[L-1] > Res && L<R)L++ ; lev[R] = L;}
    for(RG int i = 1; i <= N; i ++)
        f[i][0] = (Lg[i] <= Res),g[i][0] = (g[i-1][0] + f[i][0])%mod;
    Ans = (Lg[N] <= Res);
    for(RG int t = 1; t <= M; t ++){
        RG int j = t&1;
        g[0][j] = 0;
        for(RG int i = 1; i <= N; i ++){
            f[i][j] = (g[i-1][j^1] - g[lev[i]-2][j^1] + mod)%mod;
            if(i == N)Ans = (Ans + f[i][j])%mod;
            g[i][j] = g[i-1][j] + f[i][j];
        }
    }
    cout<<Res<<" "<<Ans; return 0;
}

[HAOI2008]木棍分割的更多相关文章

  1. BZOJ1044: [HAOI2008]木棍分割

    1044: [HAOI2008]木棍分割 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1580  Solved: 567[Submit][Statu ...

  2. BZOJ 1044: [HAOI2008]木棍分割(二分答案 + dp)

    第一问可以二分答案,然后贪心来判断. 第二问dp, dp[i][j] = sigma(dp[k][j - 1]) (1 <= k <i, sum[i] - sum[k] <= ans ...

  3. bzoj1044[HAOI2008]木棍分割 单调队列优化dp

    1044: [HAOI2008]木棍分割 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4314  Solved: 1664[Submit][Stat ...

  4. 【BZOJ1044】[HAOI2008]木棍分割(动态规划,贪心)

    [BZOJ1044][HAOI2008]木棍分割(动态规划,贪心) 题面 BZOJ 洛谷 题解 第一问随便二分一下就好了,贪心\(check\)正确性显然. 第二问随便前缀和+单调队列优化一下\(dp ...

  5. 【BZOJ1044】[HAOI2008]木棍分割

    [BZOJ1044][HAOI2008]木棍分割 题面 bzoj 洛谷 题解 第一问显然可以二分出来的. 第二问: 设\(dp[i][j]\)表示前\(i\)个,切了\(j\)组的方案数 发现每次转移 ...

  6. 1044: [HAOI2008]木棍分割

    1044: [HAOI2008]木棍分割 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2161  Solved: 779[Submit][Statu ...

  7. BZOJ1044 [HAOI2008]木棍分割 【二分+Dp】

    1044: [HAOI2008]木棍分割 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 4281  Solved: 1644 [Submit][St ...

  8. [BZOJ1044][HAOI2008]木棍分割 二分+贪心+dp+前缀和优化

    1044: [HAOI2008]木棍分割 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 4112  Solved: 1577 [Submit][St ...

  9. BZOJ_1044_[HAOI2008]木棍分割_二分答案+DP+单调队列

    BZOJ_1044_[HAOI2008]木棍分割_二分答案+DP Description 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个 ...

  10. HAOI2008 木棍分割 数据结构优化dp+二分答案

    很久之前打的题,现在补篇博客 打滚动数组 #E. 木棍分割 Accepted 100 1712 ms 1512 KiB   2019-05-07 17:01:23 Short 不打滚动数组 #419. ...

随机推荐

  1. Mysql大数据备份和增量备份及还原

    目前主流的有两个工具可以实现物理热备:ibbackup和xtrabackup ;ibbackup是需要授权价格昂贵,而xtrabackup功能比ibbackup强大而且是开源的 Xtrabackup提 ...

  2. OpenVPN的那些坑

    遇到的情形 最近遇到一种情况,当需要同时使用到多个VPN连接时,默认的openVPN连接是不支持的,但是可以通过手动配置虚拟网络适配器进行相关的设置. 具体解决方法 基本思路是:在本地的网络连接中添加 ...

  3. MySQL备份常用命令总结

    MySQL备份常用命令总结 1.数据库和数据全部备份 mysqldump -uroot -pPassword -hlocalhost databasename > test.sqlmysqldu ...

  4. docker mysql 主从复制

    当然首先 docker pull mysql mkdir /usr/local/mysqlData/master/cnf mkdir /usr/local/mysqlData/master/data ...

  5. 如何高效的编写Verilog HDL——进阶版

    博主之前写过一篇文章来谈论如何高效的编写Verlog HDL——菜鸟版,在其中主要强调了使用Notepad++来编写Verilog HDL语言的便捷性,为什么说是菜鸟版呢,因为对于新手来说,在还没有熟 ...

  6. Hadoop 错误归档库

    在hive中操作任意mapreduce相关语句 The size of Container logs revealed the below error: 2015-04-24 11:41:41,858 ...

  7. 基于全志H3芯片的ARM开发环境搭建

    基于全志H3芯片的ARM开发环境搭建 最近买了个友善之臂的NanoPi M1板子,又在网上申请了个NanoPi NEO板子,这两个都是基于全志H3芯片的Crotex-A7四核ARM开发板,两个板子可以 ...

  8. hi3531串口波特率计算

    波特率配置 通过配置寄存器UART_IBRD 和UART_FBRD 可以设置UART 工作的波特率,波特率 计算公式为: 当前波特率=UART 参考时钟频率(1/2 总线时钟频率)/(16 x 分频系 ...

  9. CSS3之background-clip

    1.属性简介 background-clip:padding|border|content|text|!important 2.兼容性 (1)IE6.7.8不兼容 (2)火狐3.0以上兼容 (3)Ch ...

  10. Error Code: 1318. Incorrect number of arguments for PROCEDURE student.new_procedure; expected 0, got

    1.错误描述 13:58:20 call new_procedure('2000','zhangsan') Error Code: 1318. Incorrect number of argument ...