首页 > 编程语言 >2024牛客寒假算法基础集训营6 K 错综的统一 题解

2024牛客寒假算法基础集训营6 K 错综的统一 题解

时间:2024-02-26 09:57:19浏览次数:29  
标签:y2 now int 题解 2024 x2 vector y1 集训营

Question

2024牛客寒假算法基础集训营6 K 错综的统一

一个矩阵仅由 "r",“e”,“d” 组成

一个矩阵区域是美丽的,当且仅当:在矩形区域内,任意横向或纵向取一个长度大于 \(1\) 的连续字串是,该字符串都不是回文的

现在有 \(Q\) 次询问,每次给定一个矩阵,问最少修改多少字符(字符只能修改 "r",“e”,“d”)可以使得该区域为 “美丽的”

Solution

枚举的力量

单独考虑回文很难,但是我们发现实际上非回文串很少

就拿一行来说,回文串就只有:

  • "redredred......"
  • "edredredr......"
  • "dredredre......"
  • "derderder......"
  • "erderderd......"
  • "rderderde......"

第二行可以是第一行向左或者向右移动一个单位来构造

也就是说,合法的非回文矩阵就 12 种,枚举每一种矩阵,找到最小的修改次数

如何快速求出一个矩阵内的修改次数,只需要利用二维前缀和即可

注意:\(2\times 2\) 的矩阵需要特判

Code

#include<bits/stdc++.h>
#define endl '\n'

const int INF = 0x3f3f3f3f;
using namespace std;

vector<string> list_s = {"red", "edr", "dre", "der" , "erd", "rde"};

int main() {
    int n, m , q;
    cin >> n >> m >> q;
    vector<vector<char>> a(n + 1, vector<char>(m + 1));
    
    for (int i = 1; i <= n; i++) 
        for (int j = 1; j <= m; j++)
            cin >> a[i][j];
    
    vector<vector<vector<char> > > p;
    for (auto &s : list_s) {
        vector<vector<char> > t(n + 1, vector<char>(m + 1));
        for (int i = 1; i <= n; i += 1)
            for (int j = 1; j <= m; j += 1)
                t[i][j] = s[((i - 1) + (j - 1)) % 3];
        p.push_back(t);

        for (int i = 1; i <= n; i += 1)
            for (int j = 1; j <= m; j += 1)
                t[i][j] = s[(((i - 1) - (j - 1)) % 3 + 3) % 3];
        p.push_back(t);
    }

    vector<vector<vector<int> > > sum;
    for (auto &t : p) {
        vector<vector<int> > s(n + 1, vector<int>(m + 1, 0));
        for (int i = 1; i <= n; i += 1)
            for (int j = 1; j <= m; j += 1)
                s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + (t[i][j] != a[i][j]);
        sum.push_back(s);
    }

    while (q --) {
        int x1, y1, x2, y2; cin >> x1 >> y1 >> x2 >> y2;
        int ans = INF;
        if (x2 - x1 + 1 == 2 && y2 - y1 + 1 == 2) {
            for (auto &s : list_s) {
                char c1 = s[0], c2 = s[1];
                int now = 0;
                now += (a[x1][y1] != c1);
                now += (a[x1][y2] != c2);
                now += (a[x2][y1] != c2);
                now += (a[x2][y2] != c1);
                ans = min(ans, now);
            }
        }
        if(true) {
            for (auto &s : sum) {
                int now = s[x2][y2] - s[x1 - 1][y2] - s[x2][y1 - 1] + s[x1 - 1][y1 - 1];
                ans = min(ans, now);
            }
        }
        cout << ans << endl;
    }

    return 0;
}

标签:y2,now,int,题解,2024,x2,vector,y1,集训营
From: https://www.cnblogs.com/martian148/p/18033691

相关文章

  • LG5290/LOJ3052 春节十二响 题解(启发式合并)
    考虑当这个东西是一条链的时候我们该怎么做,显然\(1\)​会有两个儿子,然后两个儿子分别是一条链。所以我们可以给两个儿子的链上的所有节点分别加到两个堆里,每次取出两个堆的最大值加入到我们选择的答案中,然后把两个堆的最大值全部pop掉。最终的答案就是我们pop完一个堆之后,......
  • __weak关键字和__attribute__ --20240225
    __weak关键字__weak是一个c/c++编译器关键字,用于定义一个弱化符号。弱化符号是一种在链接阶段可以被覆盖的符号,允许多个同名符号存在于不同的目标文件中,而不会产生冲突。 当一个符号被声明为__weak时,它具有两个特性:1、如果该符号在某个目标文件中被定义,那么这个定义将成为默......
  • linux动态库和静态库 --20240225
    设计库的目的1)程序更加简洁,不需要维护太多的源文件2)保护三方厂商的知识产权gcc常用指令复习一波gcc的常用指令:-E:仅执行预处理(不要编译、汇编或链接)。-S:只编译(不汇编或链接)。-c:编译和汇编,但不链接。-o<file>:指定输出文件。-pie:创建一个动态链接、位置无关的可执行文件......
  • extern、const、register、static、inline关键字 --20240225
    extern关键字extern关键字有两种用法:1、用于声明一个全局变量或函数的外部链接性2、extern"C"是一个语言特性,用于告诉编译器按照C语言的方式对待指定的代码块,以确保与C语言兼容 用法一:用于声明一个全局变量或函数的外部链接性//file1.c#include<stdio.h>intn......
  • 【Python】conda基本使用、pip换源、pip超时问题解决
    conda问题往期笔记conda安装:https://www.cnblogs.com/mllt/p/Anaconda-install.htmlconda基础操作https://www.cnblogs.com/mllt/p/jqsj_base_000.html创建环境命令行创建环境的方式见上文“conda基础操作”后面的链接文章。在此演示的是使用pycharm创建conda虚拟环境......
  • P1975 [国家集训队] 排队 题解
    题目链接:排队水紫,\(n\)不大,树套树或者分块都能做。分块的话,最优序列分块套套值域分块最优。观察到是可差性问题维护,即权值数量维护,那我们就树状数组套权值线段树即可。由于\(n\)不大,我们可以不用回收标记,直接数组空间开大点就行。我们预处理出初始逆序对,每一次操作都是基于......
  • winter 2024 第五周周报
    内容day1打的牛客寒假4,有一道挺可惜的吧,J题后面补的,一道三点共线+状压dp,没怎么学几何的东西,然后也没有准备几何的板子(就连三点共线的板子都没找到qwq)。还有F题,赛时没有一点思路看别人的代码说实话也看不太懂,一道dp吧,感觉自己dp这方面真的不行qwqday3https://www.cnblogs.com/b......
  • 省选2024
    作为一个高二且NOIP只有300分的江苏oier,压力还是有点大的。Day-?得知noip只占30%,但是省队名额只有12个。算了一下,大概我考的和去年水平一样,应该就差不多了,其实可以对标一下ybw。虽然自己水平提高确实很多,但是还是感觉很没底。毕竟去年感觉自己打的很爆炸,结果后来发现我只......
  • linux内核链表 --20240225
    提起linux内核链表,首先一定得弄清楚的两个linux内核常用宏offsetof&&container_ofoffsetof宏#defineoffsetof(TYPE,MEMBER)((size_t)&((TYPE*)0)->MEMBER)宏解析:1、size_t在系统中一般指unsignedint,无符号整型2、(TYPE*)0,把0地址强制转换成type结构体类型的指针......
  • HUAWEI Programming Contest 2024(AtCoder Beginner Contest 342)
    HUAWEIProgrammingContest2024(AtCoderBeginnerContest342)A-Yay!代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;usingpii=pair<ll,ll>;#definefifirst#definesesecondusingi128=__int128_t;usingpiii=p......