Description

你办了一场比赛,有n给人参加,只有一道题,有m个数据点,标号为1~m,每个测试点都有一个分数a[i]。现在所

有选手已经提交了程序并且测评完了,你知道每个人都能通过哪些测试点。你现在要安排捆绑测试的方式,把数据
点划分为若干个连续的区间,每个区间至少有一个测试点。每个区间只要有一个测试点错误就不会得分,如果所有
点都正确得分为所有测试点的分数的和。你的目的是最小化所有人的得分和。你需要对1<=i<=S,输出当把所有测
试点划分为i组时,最小的所有人分数和。

Input

第一行三个整数n,m,S
接下来一行m个整数,代表a[i]
接下来n行每行一个长度为m的01串,代表第i个人是否通过了第j个测试点
n<=50
m<=20000
S<=min(50,m)
a[i]<=10000,sigma a[i]*n<=2000000000

Output

S行,每行一个整数,代表当划分为i个捆绑测试点时所有人分数和的最小值

每次dp多分一段,dp时状态转移方程可分为O(n)段,且段之间的分界单调右移,用单调队列维护每个段的最值即可转移,时间复杂度O(nmS)

#include<bits/stdc++.h>
const int inf=0x7f7f7f7f;
int _(){
int x=,c=getchar();
while(c<)c=getchar();
while(c>)x=x*+c-,c=getchar();
return x;
}
void mins(int&a,int b){if(a>b)a=b;}
int min(int a,int b){return a<b?a:b;}
int n,m,q,a[],p0[];
char s[][];
int f[],t[],g[];
struct Q{
int q[],ql,qr,id;
void clr(){ql=,qr=;}
void ins(int x){
if(f[x]==inf)return;
int v=f[x]-a[x]*id;
while(ql<=qr){
int y=q[qr];
if(f[y]-a[y]*id>=v)--qr;
else break;
}
q[++qr]=x;
}
void del(int x){
if(ql<=qr&&q[ql]==x)++ql;
}
int gmn(int w){
if(ql>qr)return inf;
int x=q[ql];
return f[x]+(a[w]-a[x])*id;
}
}qs[];
int main(){
n=_(),m=_(),q=_();
for(int i=;i<=m;++i)a[i]=_()+a[i-];
for(int i=;i<=n;++i){
scanf("%s",s[i]+);
qs[i].id=i;
for(int j=;j<=m&&s[i][j]=='';++j)f[j]+=a[j];
}
printf("%d\n",f[m]);
for(int i=;i<=q;++i){
for(int j=;j<=n;++j){
p0[j]=;
qs[j].clr();
}
f[]=inf;
for(int j=;j<=m;++j){
qs[t[j]=n].ins(j-);
for(int k=;k<=n;++k)if(s[k][j]==''){
for(int z=p0[k]+;z<=j;++z){
qs[ t[z]].del(z-);
qs[--t[z]].ins(z-);
}
p0[k]=j;
}
g[j]=inf;
for(int k=;k<=n;++k)mins(g[j],qs[k].gmn(j));
}
memcpy(f,g,sizeof(int)*(m+));
printf("%d\n",f[m]);
}
return ;
}

bzoj4937: [Ceoi2016]popeala的更多相关文章

  1. [Ceoi2016|BZOJ4936] Match

    哈希+分治+stack 题目: 给你一个由小写字母组成的字符串s,要你构造一个字典序最小的(认为左括号的字典序比右括号小)合法的括号 序列与这个字符串匹配,字符串和括号序列匹配定义为:首先长度必须相等 ...

  2. 正睿OI DAY3 杂题选讲

    正睿OI DAY3 杂题选讲 CodeChef MSTONES n个点,可以构造7条直线使得每个点都在直线上,找到一条直线使得上面的点最多 随机化算法,check到答案的概率为\(1/49\) \(n ...

随机推荐

  1. 【挑战赛16A】【取石子】【组合数学】

    链接:https://www.nowcoder.com/acm/contest/113/A 来源:牛客网 取石子时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 262144K,其他语言5 ...

  2. 《DSP using MATLAB》Problem 6.17

    代码: %% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %% Output In ...

  3. ionic后台返回的数据是html模板的时候,解析html文件的方法:

    1.后台返回来的数据格式是: { "state":"100", "data":[ {"Content": "\ ...

  4. 【mysql】索引原理-MySQL索引原理以及查询优化

    转载:https://www.cnblogs.com/bypp/p/7755307.html 一.介绍 1.什么是索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性 ...

  5. word怎么在方框中打对号

    最快最简单的方法,是在word里输入一个大写的R,然后选中并将字体改为wingdings2,至于那个带叉号的方框图形,可以输入大写字母T并将字体设置为windings2

  6. linux怎么不输入路径直接运行程序脚本

    有时候我们会遇到一些程序压缩包,已解压无需安装就可以直接运行的那种,例如sendemail,就是直接把程序压缩包下载下来,解压后直接跑sendemail那个脚本就可以实现发送邮件功能 其实很简单,只需 ...

  7. MySQL Session--批量KILL会话

    使用SELECT INTO OUTFILE+SOURCE批量KILL ## 查看kill_id文件是否存在 SYSTEM cat /tmp/kill_id.sql ## 如果文件存在,则先删除 sys ...

  8. out, ref 和 params 的区别和用法

    1. out 参数. 如果你在一个方法中,返回多个相同类型的值,可以考虑返回一个数组. 但是,如果返回多个不同类型的值,返回数组就不可取.这个时候可以考虑使用out参数. out参数就侧重于在一个方法 ...

  9. LoadRunner参数化&关联

    我们用 HTTP 协议做脚本,要注意的是,不同协议的函数是不一样的,假如换 websocket 协议,关联函数就要用其他的 参数化 原理 1.什么叫参数化 把脚本内一个写死的值,去一个数组内取值,进行 ...

  10. MCU ADC 进入 PD 模式后出现错误的值?

    MCU ADC 进入 PD 模式后出现错误的值? 在调试一款 MCU,最开始问题是无法读到 ADC 的值,应该是读到的值是异常高. 怀疑问题 可能是主频太低,为了降低功耗,这个 MCU 主频被我降了很 ...