BZOJ3736 : [Pa2013]Karty

显然只需要考虑与障碍点相邻的格子,通过旋转坐标系,可以只考虑障碍点在格子上方的情况。

悬线法求出每个点往上的最长延伸距离$x$,以及往左往右的延伸距离$y$。

那么当$r\geq x$时,$c$至多为$y$。

特别地,当某个点下方也是障碍点的时候,$r$不能超过$x$。

维护出每个$r$对应的最大的$c$即可。

时间复杂度$O(nm)$。

#include<cstdio>
#include<algorithm>
const int N=2505;
int n,m,i,j,k,l[N],r[N],h[N],f[N],ans,pos;char a[N][N],b[N][N];
inline void up(int&a,int b){a>b?(a=b):0;}
void work(int n,int m,int rev){
  int i,j,k,x,y;
  for(i=1;i<=m;i++)l[i]=1,r[i]=m,h[i]=0,a[n+1][j]=‘_‘;
  for(i=1;i<=n;i++){
    for(j=k=1;j<=m;j++)if(a[i][j]==‘X‘){
      h[j]++;
      if(k>l[j])l[j]=k;
    }else h[j]=0,l[j]=1,r[j]=m,k=j+1;
    for(j=k=m;j;j--)if(a[i][j]==‘X‘){
      up(r[j],k);
      x=h[j],y=r[j]-l[j]+1;
      if(rev){
        up(f[y+1],x-1);
        if(a[i+1][j]==‘_‘)up(f[1],x);
      }else{
        up(f[x],y);
        if(a[i+1][j]==‘_‘)f[x+1]=0;
      }
    }else k=j-1;
  }
}
int main(){
  scanf("%d%d",&n,&m);
  for(i=1;i<=n;i++)scanf("%s",a[i]+1),f[i]=m;
  for(i=0;i<4;i++){
    work(n,m,i&1);
    for(j=1;j<=n;j++)for(k=1;k<=m;k++)b[k][n-j+1]=a[j][k];
    std::swap(n,m);
    for(j=1;j<=n;j++)for(k=1;k<=m;k++)a[j][k]=b[j][k];
  }
  for(i=1;i<=n;i++){
    if(i>1)up(f[i],f[i-1]);
    if(i*f[i]>ans)ans=i*f[i],pos=i;
  }
  return printf("%d %d",pos,ans/pos),0;
}

  

时间: 2024-11-03 22:22:27

BZOJ3736 : [Pa2013]Karty的相关文章

BZOJ 3736: [Pa2013]Karty

Description 一个0/1矩阵,求能覆盖所有 \(1\) ,同时不覆盖所有 \(0\) 的矩阵,使这个面积最大. Sol DP/悬线法. 首先,所求的矩阵一定可以覆盖所有贴边的悬线. 用悬线法求出,高度为 \(r\) 最大的 \(c\) ,宽度为 \(c\) 最大的高度. 上下左右都要做一遍,然后更新统计答案. 上下的时候统计的是每一个高度,左右的时候统计的是每一个宽度. 这样就可以保证所有矩阵都是一个合法的矩阵了. 我多开了几个数组,发现空间炸了...然后我就开始滚了... Code

BZOJ3733 : [Pa2013]Iloczyn

首先将$n$的约数从小到大排序,设$dfs(x,y,z)$表示当前可以选第$x$个到第$m$个约数,还要选$y$个,之前选的乘积为$z$是否可能. 爆搜的时候,如果从$x$开始最小的$y$个相乘也超过了$n$,那么就不合法,加上这个剪枝即可. #include<cstdio> #include<algorithm> #define N 2000 int T,n,k,m,i,j,q[N],f[N][22]; int dfs(int x,int y,int z){ if(!y)retu

【PA2013】【BZOJ3733】Iloczyn

Description 给定正整数n和k,问是否能将n分解为k个不同正整数的乘积 Input 第一行一个数T(T<=4000)表示測试组数 接下来T行每行两个数n(n<=10^9),k(k<=20) Output 输出T行,若能够被分解,输出"TAK"否则输出"NIE" Sample Input 3 15 2 24 4 24 5 Sample Output TAK TAK NIE HINT Source 如今BZOJ上不去没有中文题面也没法在BZO

BZOJ3735 : [Pa2013]Konduktorzy

二分一个最大的位置$x$,计算$t=\sum_{i=1}^k\lfloor\frac{x}{a_i}\rfloor$. 如果$t\leq n$,那么说明就算全部检票员都走到了这里,也不够$n$个指令,所以可以先将所有检票员尽量向$x$位置走,并将用掉的指令数扣除. 然后将$x$适当往前调整,使得每个检票员还差至少一步. 因为$a_i$互不相同,并且$a_i\leq 100000$,所以剩余指令数并不多,用堆直接模拟即可. 时间复杂度$O(k\log^2k)$. #include<cstdio>

[Pa2013]Iloczyn

https://www.zybuluo.com/ysner/note/1300802 题面 给定正整数\(n\)和\(k\),问能否将\(n\)分解为\(k\)个不同正整数的乘积. \(n\leq10^9,k\leq20,T\leq4000\) 解析 这破题目卡常,删了一堆define快一倍 可以发现\(12!=479001600>10^9\). 所以\(n\)顶多被分解成\(11\)个不同正整数. 常规操作:找出所有约数然后\(O(2^{11})\)枚举加剪枝. 然而我不会搜索啊,\(TLE\

论逗逼的自我修养——乱做计划

我看IOI各种鬼畜题目做做,深知自身姿势水平不足无以抗衡就乱搞一些傻逼题做做. 现在已经跪了0道 [BZOJ3749][POI2015]?asuchy 枚举第一个狗粮被谁吃了,后面的dp就可以了,记录下dp的路径,最后时候验证与假设是否矛盾即可. [BZOJ3750][POI2015]Piecz?? 暴力枚举左上角判断一下. [BZOJ3733][Pa2013]lloczyn 一开始用一个诡异的姿势WA了之后很久没能想出多项式做法,膜了一发鏼之后发现是大(d)法(f)师(s).我们从小到大枚举不

省选之前的未完成的计划(截至到省选)

PLAN OF THE COMING HEOI good problems:-bzoj4823:[Cqoi2017]老C的方块 [*]-bzoj3171:[Tjoi2013]循环格 [*]-bzoj4200:[Noi2015]小园丁与老司机 [*]-bzoj1061:[Noi2008]志愿者招募 [*]-bzoj3600:没有人的算术 [*]-bzoj2806:[Ctsc2012]Cheat [*]-bzoj2219:数论之神 [*]-bzoj2595:[Wc2008]游览计划 [*]-bzoj

波兰题目补全计划

Introduce 本人比较喜欢做波兰的题目,感觉这些题目十分清真,思维也比较好.欢迎同样喜欢波兰题目的OIer来交流.以下是我有记录地刷过的题目. 比较好的题吧:BZOJ #3746.[POI2015]Czarnoksi??nicy okr?g?ego sto?u source:XXII OI - Etap I - Zadanie Czarnoksi??nicy okr?g?ego sto?u notes: 动态规划我的题解http://www.cnblogs.com/TSHugh/p/882