Educational Codeforces Round 59 (Rated for Div. 2) D Compression 【dp】

求最长公共子序列长度(nlogn)【 包含了求最长上升子序列长度(nlogn)】 这里只说步骤吧,至于原理,可以自己百度找找; 假设两个序列   A,B,找两者的最长公共子序列; 第一步: 我们要去找出 A中所有与 B 相同的元素,这些元素在 B中的位置,各自为一个集合;比如 A = { a c f  d }  ,B = { c f g c a } , 则有  (从 i = 1 开始 )a ={ 5 } , c = { 1 ,4  } , f = { 2 }; a 这个元素... 阅读详情

题目链接:http://codeforces.com/contest/1107/problem/D

这道题只要把主要问题找出来就有思路了。

题目的矩阵是 n*n的,要想压缩成 n/x *n/x 的矩阵需要满足一个条件,假设x == 2,那么这个矩阵将会被分成4小块矩阵,如果这四个小矩阵每一块要么全是1要么全是0,那这个矩阵就能压缩成n/2 *n/2的矩阵。

因为题目给的n比较大,如果暴力求小矩阵是否全是1或者0肯定会超时的。

我用的方法是dp求出每一个 左上角为0*0,右下角为i*j 这个矩阵的和,当我们需要某一块小矩阵的时候,能直接取出dp[i][j] 并且除去不需要的部分就能很快的知道某个小矩阵的和。

只要主要问题能找出来,上面的dp应该也能想得到,其次还有一个难点就是输入的快慢。

起初的方法是用一个字符串存16个二进制数,然后一个一个的放入矩阵里面,但是这种方法非常慢。

换成二进制位移判断1或0的方法赋值能快非常多。

#include <iostream>
#include <queue>
#include <cstring>
#include <string>
#include <map>
#include <cstdio>
#include <cmath>
#include <algorithm>

using namespace std;

const int INF = 0x3f3f3f3f;
const int Maxn = 6e3+10;

int dp[Maxn][Maxn], n;
char G[Maxn][Maxn];

void init() {
    for(int i = 0; i < n; ++i)
        if(G[i][0] == '1') dp[i][0] = 1;

    for(int i = 0; i < n; ++i) {
        for(int j = 1; j < n; ++j) {
            dp[i][j] += dp[i][j-1];
            if(G[i][j] == '1') dp[i][j]++;
        }
    }
    for(int j = 0; j < n; ++j) {
        for(int i = 1; i < n; ++i) {
            dp[i][j] += dp[i-1][j];
        }
    }
}

void solve() {
    int ans = 1;
    for(int i = 2; i <= n; ++i) {
        bool ok = true;
        if(n % i != 0) continue;
        for(int ii = i-1; ii <= n; ii += i) {
            for(int jj = i-1; jj <= n; jj += i) {
                int tmp = dp[ii][jj];
                if(ii-i >= 0 && jj-i >= 0) tmp += dp[ii-i][jj-i];
                if(ii-i >= 0) tmp -= dp[ii-i][jj];
                if(jj-i >= 0) tmp -= dp[ii][jj-i];
                if(tmp == 0 || tmp == i*i) continue;
                else {
                    ok = false; break;
                }
            }
            if(!ok) break;
        }
        if(ok) ans = i;
    }
    printf("%d\n", ans);
}

int main(void)
{
    char str[Maxn];
	scanf("%d", &n);
	for(int i = 0; i < n; ++i) {
        scanf("%s", str);
        for(int j = 0; j < (n>>2); ++j) {
            int num = str[j] <= '9' ? str[j]-'0' : str[j]-'A'+10;
            int fir = j*4;
            for(int k = 0; k < 4; ++k) {
                if((num>>k) & 1) G[i][fir+3-k] = '1';
                else G[i][fir+3-k] = '0';
            }
            G[i][fir+4] = '\0';
        }
	}
	memset(dp, 0, sizeof(dp));
	init();
	solve();
	return 0;
}

 

手把手教你配置UEFI Secure Boot:从密钥生成到系统验证(附避坑指南) 本文详细介绍了如何配置UEFI Secure Boot,从密钥生成到系统验证的全过程,包括PK、KEK等关键密钥的生成方法,以及常见问题的解决方案。通过实战案例和避坑指南,帮助用户有效提升系统启动安全性,防止恶意软件植入。 阅读详情

相关推荐

LangChain实战:用FAISS搭建本地文档问答系统(含Word文件处理避坑指南)

本文详细介绍了如何利用LangChain框架和FAISS向量数据库构建本地化智能文档问答系统,特别针对Word文档处理中的技术难点提供实用解决方案。通过模块化设计、本地化支持和多格式兼容,实现高效文档处理与精准问答,满足企业对数据隐私和安全的需求。

o4p5q6r7s的博客 408

codeforces1107D. Compression

题目链接 琪亚娜世界第一可爱 给出矩阵A,构造矩阵B,满足: i∈[1,n],j∈[1,n]且nmod&ThinSpace;&ThinSpace;x=0,满足A[i][j]=B[⌈ix⌉][⌈jx⌉]i\in [1,n] , j\in [1,n] 且n\mod x =0,满足A[i][j]=B[\lceil\frac{i}{x}\rceil][\lceil \frac{j}{...

突破吧!次元壁 437

Rasa Core开发指南

文章目录1. Rasa Core简介1.1 Rasa Core消息处理流程1.2 安装Rasa Core2. Dialogue模型训练2.1 Story样本数据2.2 Domain2.2.0 intents2.2.1 actions2.2.2 templates2.2.3 entities2.2.4 slots3 .训练和使用对话模型3.1 训练对话模型3.2 使用对话模型4. 搭建CustomA...

老蒋也疯狂 1万+

Educational Codeforces Round 59 (Rated for Div. 2) D. Compression

题目链接   http://codeforces.com/contest/1107/problem/D   1、首先要把十六进制转化为2进制吧,这里用到了位运算,取出他的每一位和1按位与就可以求出二进制,注意这里需要倒着储存 2、判断是否能压缩能x时,是通过x*x的矩阵中是不是全是1或0,所以就先求和判断,这里是先把和全部算出来,储存在一个数组里,然后判断。 看了题解和其他的代码然后才写出...

甦萌的博客 360

Fedora 41上安装钉钉7.6.25,我踩过的那些依赖坑和最终解决方案

本文详细记录了在Fedora 41上安装钉钉7.6.25版本的全过程,包括解决依赖问题、转换deb包为rpm格式、处理libm.so.6错误等关键步骤。通过分享这些实用技巧和最终解决方案,帮助Linux用户顺利在Fedora系统上运行钉钉客户端,提升工作效率。

weixin_30485379的博客 204

【Unity优化篇】| Unity3D场景 常用优化策略,遮挡剔除、层消隐距离技术 和 LOD多层次细节

本篇文章来简单介绍一下 Unity中几种常用3D场景优化策略 方法 对于整个项目来说,本文中出现的方法也只是冰山一角,慢慢积累学习吧! 内容包括遮挡剔除(Occlusion Culling)、层消隐距离技术 和 LOD多层次细节

努力前行,总会成为自己心中的那道光 1万+

【Codeforces】Educational Codeforces Round 59/Round1107 D-G题解

CF1107

远行客 631

Trae 保姆级使用指南,零基础小白也能实现编程。

Trae 使用指南 Trae AI 使用 零基础编程 满血版 DeepSeek-R1&V3 AI IDE 深度理解中文开发场景 傻瓜式编程 编程入门 开发入门

Mr.L-OAM的博客 5813

Codeforces Contest 1107 problem G Vasya and Maximum Profit—— 枚举每个不可控制的量找它所对应区间的数的最大值

Vasya got really tired of these credits (from problem F) and now wants to earn the money himself! He decided to make a contest to gain a profit. Vasya has n problems to choose from. They are numbered ...

天翼之城的博客 362

uniapp - 热更新提示:WGT安装包中manifest.json文件不存在 | unexpected EOF!报错详细解决,完美搞定WGT安装包中WWW目录下manifest.json不存在问题

uniapp,安卓android,苹果ios,热更新,热更新code:-1202报错,,WGT热更新报错,uniapp热更新wgt出现报错manifest.json文件不存,uniapp安卓苹果软件热更新时出现错误unexpected EOF!如何解决,怎么解决热更新wgt报错,app新版本下载安装报错WGT安装包中manifest.json文件不存在,WGT安装包中WWW目录下manifest.json不存在,uniapp热更新报错安装失败[-1201]:WGT/WGTU文件格式错误,uniapp-wgt

✅ 精选推荐文章 1万+

MuJoCo 入门教程(二)

本章介绍 MuJoCo 的数学和算法基础。对于熟悉广义或关节坐标建模和仿真的读者来说,整体框架是相当标准的。因此,我们将对这些材料进行简要总结。本章的大部分篇幅用于介绍我们如何处理接触和其他约束条件。这种方法是基于我们最近的研究,也是 MuJoCo 所独有的,因此我们花时间对其进行了详细的激励和解释。更多信息可参见下面的论文,尽管本章中的一些技术思想是新的,在其他地方还没有描述过。

机器人控制与仿真应用 3712

【Codeforces 1107D】Compression

【链接】 我是链接,点我呀:) 【题意】 题意 【题解】 先把所给的压缩形式的字符串转成二进制 然后对获得的01数组做一个前缀和(a[i][j]=以(i,j)为右下角,(1,1)为左上角的矩形内的数字的和) 这样就能O(1)复杂度获得一个长度为x的正方形的区间和了。 这样。我们直接暴力从1..n枚举n的因子x 显然每个因子x要进行(n/x)^2次判断。 有个性质 ∑(n/...

210

论文阅读:arxiv 2023 EduChat: A Large-Scale Language Model-based Chatbot System for Intelligent Education

EduChat是一个基于大规模语言模型(LLM)的教育领域聊天机器人系统,旨在为教师、学生和家长提供个性化、公平且富有同理心的智能教育服务。该系统通过在教育语料库上进行预训练和特定任务微调,强化了开放式问答、作文评估、苏格拉底式教学和情感支持等教育功能。为解决领域知识不足和知识更新问题,EduChat采用了检索增强技术,并融入心理学和教育学理论。该项目已开源,提供代码、数据和模型参数,推动LLM在智能教育中的应用发展。

CSPhD-winston的博客 1039

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Codeforces 1107 2019/2/4

http://codeforces.com/contest/1107/problem/A A题,水题,给出一串序列,让你任意分割成任意段,要求每段都要递增。 题解:只需要切割成两段就行了。 坑点:字符串的最后一位是n-1,还有就是要看题,题目要求写出分割了多少段,for(int i=1;i&lt;n;i++) for(int i=1;i&lt;=n;i++)  wa*3 学习:S.subs...

Ziwen_的博客 405

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Codeforces Contest 1107 problem D Compression—— 前缀和找压缩矩阵

You are given a binary matrix A of size n×n. Let’s denote an x-compression of the given matrix as a matrix B of size nx×nx such that for every i∈[1,n],j∈[1,n] the condition A[i][j]=B[⌈ix⌉][⌈jx⌉] is me...

天翼之城的博客 362

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Educational Codeforces Round 59 (Rated for Div. 2) D. Compression 暴力

题目链接: 传送门 代码如下: #include &lt;bits/stdc++.h&gt; using namespace std; const int maxn=5205; int n; string a[maxn]; int Judge (int x) { for (int i=0;i&lt;n;i+=x) { for (int j=0;j&lt;n;...

zamaochick的博客 344

CodeForces - 1107D Compression(思维)

You are given a binary matrix A of size n×n. Let’s denote an x-compression of the given matrix as a matrix B of size nx×nx such that for every i∈[1,n],j∈[1,n] the condition A[i][j]=B[⌈i/x⌉][⌈j/x⌉] is ...

weixin_43896680的博客 420

poj 1742 Coins 【多重背包+二进制拆分优化】

  Coins Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3969    Accepted Submission(s): 1578   Problem Description Whuacmers use coins.They...

Y390d的博客 3046

Codeforces Round #523 (Div. 2) C. Multiplicity 【dp】

题目链接:http://codeforces.com/contest/1061/problem/C 思路: 像类似这种求有衔接关系的数列要第一时间想到  dp[ i ] = dp[ i ] + dp[ i - 1 ] 这种状态的dp,为什么? 假设我要让一个原数组下标为 4的数变成下标为 3 的数,那么要想数列存在,那么 必须存在 至少一个 长度为2的数列,在这些数列的尾部加上这个原数组下标...

Y390d的博客 612

POJ 2576 Tug of War 【二维01背包】

  Tug of War Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 9236   Accepted: 2572 Description A tug of war is to be arranged at the local office picnic. For the tug of...

Y390d的博客 559

最大连续子序列 【递推(dp)】

    给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ...,  Nj },其中 1 &lt;= i &lt;= j &lt;= K。最大连续子序列是所有连续子序列中元素和最大的一个,  例如给定序列{ -2, 11, -4, 13, -5, -2 },其最大连续子序列为{ 11, -4, 13 },最大和  为20。  在今年的数据...

Y390d的博客 386

HDU - 2546 饭卡 【01背包+排序】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2546 题目问的是最小容量,而且容量可能会负数,我们可以换个角度解决问题,比如题目允许的容量是 5~m,我们可以把容量设置成 m~2*m-5,这样做的好处是能把可能为负数的结果变成正数,那么就可以用01背包求解问题(dp[容量]),求的是最大值。 另外需要给价格排序,比如下面这个两个数据,自己可以...

Y390d的博客 350

POJ 2018 【二分答案+dp求最大区间段】

题目链接:http://poj.org/problem?id=2018 从0到2000000(2000*1000) 枚举平均值,让数组统一减去枚举的平均值,如果存在区间和大于等于0的,就说明答案是成立的。 关键是如果求最大的区间和。 假设不限制区间的长度,求某一个数组的最大区间和应该怎么求? 如果dp[i]表示的是某左界到右界 i 的最大区间和,那么dp[i+1] 应该如果求? 因为要求...

Y390d的博客 347

HDU 1114 Piggy-Bank 【完全背包(时间优化)】

    Problem Description Before ACM can do anything, a budget must be prepared and the necessary financial support obtained. The main income for this action comes from Irreversibly Bound Money (IBM)...

Y390d的博客 300

HRBUST - 2382 极难的问题 【数位dp + 二分】

题目链接:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&amp;a=showProblem&amp;problem_id=2382 思路: 数位dp能够求出0到m区间内的符合某个条件的数字个数,在数位dp的条件下通过二分找出符合题意的那个数字 需要注意的是,题目的n虽然是int范围内的,但是n代表的是符合题意数字的个数,所有实际需要找的范围应...

Y390d的博客 280
上一篇: HDU - 1043 Eight 【反向BFS打表】
下一篇: HDU - 3567 Eight II 【bfs打表+映射+康托展开】
Y390d
博客等级 码龄9年 11粉丝 165原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值