[arc081f]Flip and Rectangles

本文介绍了一种算法,用于解决一个黑白网格图通过翻转行和列颜色来获得最大黑色子矩阵的问题。核心思路在于判断2×2子矩阵中黑色数量的奇偶性,并利用单调栈优化解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

一开始想如何染色成功。
发现只需要讨论四元环。
然后发现可以直接把规模缩成2*2矩阵。

题目大意

一个黑白网格图,你可以翻转任意行和任意列的颜色,求以此得到网格图最大黑色子矩阵面积。

做法

结论是一个矩阵如果任意一个2*2子矩阵都有偶数个黑色,一定可以通过翻转操作扭转为全黑。
易证必要充分。
然后就可以做经典问题。

#include<cstdio>
#include<algorithm>
#define fo(i,a,b) for(i=a;i<=b;i++)
using namespace std;
const int maxn=2000+10;
bool bz[maxn][maxn],pd[maxn][maxn];
int up[maxn][maxn],sta[maxn];
int i,j,k,l,t,n,m,ans,top;
char get(){
    char ch=getchar();
    while (ch!='#'&&ch!='.') ch=getchar();
    return ch;
}
int main(){
    scanf("%d%d",&n,&m);
    fo(i,1,n){
        fo(j,1,m)
            if (get()=='#') bz[i][j]=1;
    }
    fo(i,2,n)
        fo(j,2,m){
            t=(bz[i-1][j-1]+bz[i-1][j]+bz[i][j-1]+bz[i][j])%2;
            if (!t) pd[i-1][j-1]=1;
        }
    fo(i,1,n-1)
        fo(j,1,m-1) up[i][j]=pd[i][j]?up[i-1][j]+1:0;
    ans=max(n,m);
    fo(i,1,n-1){
        top=0;
        fo(j,1,m){
            while (top&&up[i][j]<=up[i][sta[top]]){
                ans=max(ans,(j-sta[top-1])*(up[i][sta[top]]+1));
                top--;
            }
            sta[++top]=j;
        }
    }
    printf("%d\n",ans);
}
<think>好的,我现在需要处理用户关于“not and flip-flop”的查询。首先,用户可能指的是“NAND锁存器”或类似的逻辑电路,但“not and flip-flop”这个术语并不常见,可能需要先确认正确的术语。 用户可能将NAND门(NOT AND)与触发器(Flip-Flop)结合起来,所以应该解释NAND门构成的SR锁存器,这是最基本的触发器类型之一。需要分步骤说明,结构清晰。 首先,要介绍基本概念:触发器是存储1位数据的电路,有两种稳定状态。然后,解释SR锁存器由两个交叉耦合的NAND门组成,说明其结构和工作原理。 接下来需要列出真值表,说明不同的输入组合(S和R)对应的输出状态。注意当S和R都为1时保持状态,而0和0的情况可能导致不确定状态,需要指出这一点。 然后,比较NAND和NOR构成的锁存器差异,比如有效输入电平的不同。这部分需要准确,避免错误。 可能用户需要了解触发器的应用,比如在寄存器和内存中的作用,但用户的问题集中在介绍,所以保持基础层面的解释,不过于深入时序或其他类型触发器。 需要检查是否符合系统级指令:数学公式用$...$,独立公式用$$...$$,结构清晰,使用中文。确保LaTeX语法正确,例如真值表中的0和1用$0$和$1$,变量用斜体。 最后,确保回答帮助用户逐步理解,从基本概念到结构,再到工作原理和应用,避免专业术语过多,但保持准确性。需要确认是否将NAND锁存器称为触发器的一种,因为严格来说锁存器和触发器在触发方式上有区别,但通常基础教学中可能混用,需注意说明。 总结步骤: 1. 定义触发器和锁存器 2. NAND门构成的SR锁存器结构 3. 真值表和状态分析 4. 与NOR锁存器的比较 5. 应用场景 确保每个部分简洁明了,使用中文术语,必要时用公式表示逻辑门符号,但用户可能更关注逻辑关系而非具体电路图,所以用文字描述结构即可。</think>以下是关于 **NAND锁存器(NAND-based Flip-Flop)** 的逐步解释: --- ### 1. **基本概念** - **触发器(Flip-Flop)** 是一种能够存储 **1位二进制数据** 的电路,具有两种稳定状态($0$ 或 $1$)。 - **锁存器(Latch)** 是触发器的基本形式,通常由逻辑门(如NAND、NOR)交叉耦合构成。 --- ### 2. **NAND锁存器的结构** NAND锁存器由 **两个交叉耦合的NAND门** 组成: - 输入:$\overline{S}$(置位端,低电平有效)和 $\overline{R}$(复位端,低电平有效)。 - 输出:$Q$ 和 $\overline{Q}$(互补输出)。 **电路示意图**: ``` +---------+ S̅ -----| NAND |------ Q | Gate 1| +----+----+ | +-----+ | +----+----+| R̅ -----| NAND || | Gate 2||------ Q̅ +---------+ ``` --- ### 3. **工作原理** 通过输入 $\overline{S}$ 和 $\overline{R$ 的组合控制输出状态: | $\overline{S}$ | $\overline{R}$ | $Q$ | $\overline{Q}$ | **状态** | |----------------|----------------|----------|----------------|------------------| | $1$ | $1$ | 保持原值 | 保持原值 | **保持(Hold)** | | $0$ | $1$ | $1$ | $0$ | **置位(Set)** | | $1$ | $0$ | $0$ | $1$ | **复位(Reset)**| | $0$ | $0$ | $1$ | $1$ | **无效(禁止)** | - **保持状态**:当 $\overline{S}=\overline{R}=1$ 时,输出维持当前值。 - **置位/复位**:$\overline{S}=0$ 强制 $Q=1$;$\overline{R}=0$ 强制 $Q=0$。 - **无效状态**:$\overline{S}=\overline{R}=0$ 会导致 $Q=\overline{Q}=1$,违反互补关系,需避免。 --- ### 4. **NAND锁存器 vs. NOR锁存器** | **特性** | **NAND锁存器** | **NOR锁存器** | |----------------|---------------------------|---------------------------| | **有效输入** | 低电平($0$)触发 | 高电平($1$)触发 | | **默认输入** | $\overline{S}=\overline{R}=1$ | $S=R=0$ | | **禁止状态** | $\overline{S}=\overline{R}=0$ | $S=R=1$ | --- ### 5. **应用场景** - **数据存储**:用作寄存器、缓存的基础单元。 - **时序控制**:在时钟信号协调下构建边沿触发的触发器(如D触发器)。 - **去抖动电路**:消除机械开关的抖动噪声。 --- ### 总结 NAND锁存器通过交叉耦合的NAND门实现状态存储,是数字电路中的核心组件。理解其真值表和输入逻辑是掌握时序电路设计的关键步骤。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值