如果答案在某个碎片内部,那么直接悬线法解决,时间复杂度$O(n\sum)$。

如果$n$比较大,那么$\sum$比较小。

求出每个点向上能延伸的长度,枚举每个点向上这条线段作为短板。

算出完全可选的碎片的长度之和以及不能完全选,左边右边最大次大延伸距离,更新答案。

时间复杂度$O(n\sum^2)$。

如果$n$比较小,那么暴力枚举上下边界,计算答案方法同上。

时间复杂度$O(n^2\sum)$。

总时间复杂度$O(n\sum\sqrt{n\sum})$。

#include<cstdio>
const int N=100010,M=320;
int T,num,n,m,i,j,k,x,cnt,FL0,GL,FL1,FR0,GR,FR1,ans;
inline void up(int&f0,int&g0,int&f1,int x,int y){
if(x>f0){f1=f0,f0=x,g0=y;return;}
if(x>f1)f1=x;
}
inline void uans(int x){if(ans<x)ans=x;}
namespace NSMALL{
int st[N],en[N],f[N],g[N],w[N];char a[M][N],s[N];
void solve(){
for(i=1;i<=num;i++){
scanf("%d",&x);
st[i]=m+1;
en[i]=m+x;
for(j=1;j<=n;j++){
scanf("%s",s);
for(k=0;k<x;k++)a[j][k+st[i]]=s[k]-'0';
}
m+=x;
}
for(i=1;i<=m;i++)f[i]=1,g[i]=m,w[i]=0;
for(i=1;i<=n;i++){
for(GL=j=1;j<=m;j++)if(!a[i][j]){
w[j]++;
if(GL>f[j])f[j]=GL;
}else w[j]=0,f[j]=1,g[j]=m,GL=j+1;
for(GR=j=m;j;j--)if(!a[i][j]){
if(GR<g[j])g[j]=GR;
uans(w[j]*(g[j]-f[j]+1));
}else GR=j-1;
}
for(i=1;i<=n;i++){
for(k=1;k<=num;k++)f[k]=en[k],g[k]=st[k];
for(j=i;j<=n;j++){
cnt=FL0=GL=FL1=FR0=GR=FR1=0;
for(k=1;k<=num;k++){
for(x=st[k];x<=en[k];x++)if(a[j][x])break;
if(f[k]>x-1)f[k]=x-1;
for(x=en[k];x>=st[k];x--)if(a[j][x])break;
if(g[k]<x+1)g[k]=x+1;
if(f[k]==en[k]){cnt+=en[k]-st[k]+1;continue;}
up(FL0,GL,FL1,f[k]-st[k]+1,k);
up(FR0,GR,FR1,en[k]-g[k]+1,k);
}
if(GL!=GR)uans((j-i+1)*(cnt+FL0+FR0));else{
uans((j-i+1)*(cnt+FL0+FR1));
uans((j-i+1)*(cnt+FL1+FR0));
}
}
}
}
}
namespace NBIG{
int st[M],en[M],f[M],g[M],w[M];char a[N][M],s[M];
void solve(){
for(i=1;i<=num;i++){
scanf("%d",&x);
st[i]=m+1;
en[i]=m+x;
for(j=1;j<=n;j++){
scanf("%s",s);
for(k=0;k<x;k++)a[j][k+st[i]]=s[k]-'0';
}
m+=x;
}
for(i=1;i<=m;i++)f[i]=1,g[i]=m,w[i]=0;
for(i=1;i<=n;i++){
for(GL=j=1;j<=m;j++)if(!a[i][j]){
w[j]++;
if(GL>f[j])f[j]=GL;
}else w[j]=0,f[j]=1,g[j]=m,GL=j+1;
for(GR=j=m;j;j--)if(!a[i][j]){
if(GR<g[j])g[j]=GR;
uans(w[j]*(g[j]-f[j]+1));
}else GR=j-1;
}
for(i=1;i<=m;i++)w[i]=0;
for(i=1;i<=n;i++){
for(j=1;j<=m;j++)if(a[i][j])w[j]=0;else w[j]++;
for(j=1;j<=m;j++)if(w[j]){
cnt=FL0=GL=FL1=FR0=GR=FR1=0;
for(k=1;k<=num;k++){
for(x=st[k];x<=en[k];x++)if(w[x]<w[j])break;
f[k]=x-1;
for(x=en[k];x>=st[k];x--)if(w[x]<w[j])break;
g[k]=x+1;
if(f[k]==en[k]){cnt+=en[k]-st[k]+1;continue;}
up(FL0,GL,FL1,f[k]-st[k]+1,k);
up(FR0,GR,FR1,en[k]-g[k]+1,k);
}
if(GL!=GR)uans(w[j]*(cnt+FL0+FR0));else{
uans(w[j]*(cnt+FL0+FR1));
uans(w[j]*(cnt+FL1+FR0));
}
}
}
}
}
int main(){
scanf("%d",&T);
while(T--){
scanf("%d%d",&num,&n);
m=ans=0;
if(n<=315)NSMALL::solve();else NBIG::solve();
printf("%d\n",ans);
}
return 0;
}

  

BZOJ3873 : [Ahoi2014]拼图的更多相关文章

  1. BZOJ 3873: [Ahoi2014]拼图

    BZOJ 3873: [Ahoi2014]拼图 标签(空格分隔): OI-BZOJ OI-DP Time Limit: 10 Sec Memory Limit: 256 MB Description ...

  2. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  3. 「AHOI2014/JSOI2014」拼图

    「AHOI2014/JSOI2014」拼图 传送门 看到 \(n \times m \le 10^5\) ,考虑根号分治. 对于 \(n < m\) 的情况,我们可以枚举最终矩形的上下边界 \( ...

  4. [AHOI2014/JSOI2014] 解题报告

    [AHOI2014/JSOI2014] 奇怪的计算器 一个很关键的结论,任何时候每个数的相对大小是不变的. 于是可以把这个相对大小当成线段树的权值,每次只需要维护一下区间极值和tag就好了,关于操作四 ...

  5. bzoj3874&2832 [Ahoi2014]宅男计划 模拟退火,三分

    [Ahoi2014&Jsoi2014]宅男计划 Time Limit: 1 Sec  Memory Limit: 256 MBSubmit: 962  Solved: 371[Submit][ ...

  6. [luogu] P4040 [AHOI2014/JSOI2014]宅男计划(贪心)

    P4040 [AHOI2014/JSOI2014]宅男计划 题目背景 自从迷上了拼图,JYY就变成了个彻底的宅男.为了解决温饱问题,JYY不得不依靠叫外卖来维持生计. 题目描述 外卖店一共有N种食物, ...

  7. Bzoj 3874: [Ahoi2014&Jsoi2014]宅男计划 三分+贪心

    3874: [Ahoi2014&Jsoi2014]宅男计划 Time Limit: 1 Sec  Memory Limit: 256 MBSubmit: 861  Solved: 336[Su ...

  8. 拼图小游戏之计算后样式与CSS动画的冲突

    先说结论: 前几天写了几个非常简单的移动端小游戏,其中一个拼图游戏让我郁闷了一段时间.因为要获取每张图片的位置,用`<style>`标签写的样式,直接获取计算后样式再用来交换位置,结果就悲 ...

  9. JavaScript版拼图小游戏

    慕课网上准备开个新的jQuery教程,花了3天空闲时间写了一个Javascript版的拼图小游戏,作为新教程配套的分析案例 拼图游戏网上有不少的实现案例了,但是此源码是我自己的实现,所以不做太多的比较 ...

随机推荐

  1. Linux常用的日志分析命令与工具

    >>基础命令 操作 命令 说明 查看文件的内容 cat -n access.log -n显示行号 分页显示文件 more access.log Enter下一行,空格下一页,F下一屏,B上 ...

  2. SQL分页存储过程——表名、返回的列、排序字段、排序类型、条件、页尺寸、页码

    ALTER PROCEDURE [dbo].[SP_LGY_ICU_PAGECUT] ), -- 表名 ) = '*', -- 需要返回的列 )='''', -- 排序的欄位名 , -- 設置排序類型 ...

  3. Android浏览本地 API文档 + 解决页面加载慢的问题

    火狐浏览器安装离线浏览插件: 用浏览器打开index.html文件,你会发现加载的很慢,原因你懂的,为此,我们可以通过离线的方式 查看本地API文档,用火狐浏览器  +   Work Offline插 ...

  4. Delphi基础语法的学习笔记和注意事项总结

    以下是我在自学Delphi的时候,对一些注意点的简单总结,并没有什么系统性可言,只是一个学习时顺手记下的笔记,主要为了当时加深对知识的印象,并没有希望能在以后的复习和使用Delphi中有什么多大的参考 ...

  5. Log4Net配置以及使用

    跟踪程序代码,及时发现程序的运行状态,是每个成熟的软件所必不可少的一个环节,网站发布到真实的环境之后,对于程序的运行状态,我们并不能想开发环境那也,点击调试.日志记录显示就尤为重要,在.NET中记录日 ...

  6. 在Activity和Application中使用SharedPreferences存储数据

    1.在Activity中创建SharedPreferences对象及操作方法 SharedPreferences pre=getSharedPreferences("User", ...

  7. ubuntu中jdk已经安装,但是eclipse启动报错

    问题描述 在ubuntu中,jdk已经正常安装,java_home变量已经配置,但是启动eclipse的时候还是弹出以下错误信息: A Java RunTime Environment (JRE) o ...

  8. 在Salesforce中添加Workflow Rule

    在Salesforce中可以添加Workflow Rule来执行特定的动作,比如说:当Object的某个字段发生变化时,根据变化的值去修改其他field,和Trigger的功能很类似,不过Trigge ...

  9. Java学习随笔1:Java是值传递还是引用传递?

    Java always passes arguments by value NOT by reference. Let me explain this through an example: publ ...

  10. 权限管理AppOpsManager

    AppOps工具类 import android.annotation.TargetApi; import android.app.AppOpsManager; import android.cont ...