Codeforces 1383D - Rearrange(构造)
一道不算困难的构造,花了一节英语课把它搞出来了,题解简单写写吧(
考虑从大往小加数,显然第三个条件可以被翻译为,每次加入一个元素,如果它所在的行/列存在元素,那么它必须为这一行/列所在的元素相邻,因此我们考虑这样构造,当我们加入一个数 \(v\) 时,分以下几种情况考虑:
- 如果 \(v\) 在原矩阵中既是行的最大值,也是列的最大值,那我们新开一行一列并将这个元素塞进去。即我们动态维护一个 \(R,C\) 表示目前有 \(R\) 行 \(C\) 列有元素,那么遇到这样的 \(v\),我们令 \(R,C\) 都加一然后令 \(b_{R,C}=v\) 即可。
- 如果 \(v\) 在原矩阵中只是行的最大值不是列的最大值,那么我们只令 \(R\) 加 \(1\) 而不用令 \(C\) 加 \(1\),然后还是令 \(b_{R,C}=v\)。
- 如果 \(v\) 在原矩阵中只是列的最大值不是行的最大值,与上面的情况不同之处在于,这次我们要令 \(C\) 加 \(1\) instead of \(R\)。
- 如果 \(v\) 在原矩阵中既不是行的最大值也不是列的最大值,那么我们就找到一个位置 \((x,y)\) 满足 \((x,y)\) 上未填上数,并且 \((x,y)\) 恰好与两个已经填上格子的位置相邻,并令 \(b_{x,y}=v\)。可以证明我们总能找到这样的位置,因为在值最大的 \(RC+1\) 个格子中必然要么有超过 \(R\) 个行最大值,要么有超过 \(C\) 个列最大值,因此不会出现没地方填的情况。而显然如果前 \(R\) 行 \(C\) 列没有填满,由于我们构造的特殊性,我们总能找到一个空格子满足其与 \(2\) 个填上值的位置相邻,因此我们的构造总是合法的。这一部分可以通过维护一个队列,每次新填上一个值就遍历一遍与其相邻的格子,检验其是否与 \(2\) 个填上值的位置相邻来实现。
时间复杂度 \(\mathcal O(nm)\)
const int MAXN=250;
const int dx[]={1,0,-1,0};
const int dy[]={0,1,0,-1};
int n,m,a[MAXN+5][MAXN+5],vis1[MAXN*MAXN+5],vis2[MAXN*MAXN+5];
int X=0,Y=0,b[MAXN+5][MAXN+5];queue<pii> q;
bool check(int x,int y){
if(x<1||x>n||y<1||y>m) return 0;
if(b[x][y]) return 0;
int cnt=0;
for(int i=0;i<4;i++) cnt+=(b[x+dx[i]][y+dy[i]]>0);
return cnt==2;
}
void relax(int x,int y){
for(int i=0;i<4;i++) if(check(x+dx[i],y+dy[i])) q.push(mp(x+dx[i],y+dy[i]));
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&a[i][j]);
for(int i=1;i<=n;i++){
int mx=0;
for(int j=1;j<=m;j++) chkmax(mx,a[i][j]);
vis1[mx]=1;
}
for(int i=1;i<=m;i++){
int mx=0;
for(int j=1;j<=n;j++) chkmax(mx,a[j][i]);
vis2[mx]=1;
}
for(int i=n*m;i;i--){
if(vis1[i]&&vis2[i]) b[++X][++Y]=i,relax(X,Y);
else if(vis1[i]) b[++X][Y]=i,relax(X,Y);
else if(vis2[i]) b[X][++Y]=i,relax(X,Y);
else{
while(1){
pii p=q.front();q.pop();
if(!b[p.fi][p.se]){
b[p.fi][p.se]=i;
relax(p.fi,p.se);
break;
}
}
}
}
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++)
printf("%d%c",b[i][j]," \n"[j==m]);
return 0;
}
Codeforces 1383D - Rearrange(构造)的更多相关文章
- codeforces 1041 e 构造
Codeforces 1041 E 构造题. 给出一种操作,对于一棵树,去掉它的一条边.那么这颗树被分成两个部分,两个部分的分别的最大值就是这次操作的答案. 现在给出一棵树所有操作的结果,问能不能构造 ...
- Codeforces - 474D - Flowers - 构造 - 简单dp
https://codeforces.com/problemset/problem/474/D 这道题挺好的,思路是这样. 我们要找一个01串,其中0的段要被划分为若干个连续k的0. 我们设想一个长度 ...
- Codeforces Global Round 8 B. Codeforces Subsequences(构造)
题目链接:https://codeforces.com/contest/1368/problem/B 题意 构造最短的至少含有 $k$ 个 $codeforces$ 子序列的字符串. 题解 如下表: ...
- Codeforces 410C.Team[构造]
C. Team time limit per test 1 second memory limit per test 256 megabytes input standard input output ...
- Codeforces 716C[数论][构造]
/* CF傻逼构造题 某人要经过n回合游戏,初始分值是2,等级为1. 每次有两种操作 1.无条件,分值加上自己的等级数. 2.当目前的数字是完全平方数并且该数字开方以后是等级数加1的整数倍,那么可以将 ...
- Tea Party CodeForces - 808C (构造+贪心)
Polycarp invited all his friends to the tea party to celebrate the holiday. He has ncups, one for ea ...
- Codeforces.578E.Walking(构造)
题目链接 \(Description\) 给定一个长为\(n\)的足迹序列(只包含\(L,R\)两种字符),你需要\(LRLRLR...\)这样交替在\(L\)和\(R\)上走(第一步可以选择\(L\ ...
- New Roads CodeForces - 746G (树,构造)
大意:构造n结点树, 高度$i$的结点有$a_i$个, 且叶子有k个. 先确定主链, 然后贪心放其余节点. #include <iostream> #include <algorit ...
- Subordinates CodeForces - 737C (树,构造)
大意: 求构造一棵树, 每个节点回答它的祖先个数, 求最少打错次数. 挺简单的一个构造, 祖先个数等价于节点深度, 所以只需要确定一个最大深度然后贪心即可. 需要特判一下根的深度, 再特判一下只有一个 ...
随机推荐
- C++的智能指针学习笔记(初)
C++ primer plus 16.2节介绍了auto_ptr,该模板类在C++11中已弃用,目前已被shared_ptr代替. auto_ptr又叫做智能指针,用于管理动态内存分配的用法. 为什么 ...
- Hive面试题整理(一)
1.Hive表关联查询,如何解决数据倾斜的问题?(☆☆☆☆☆) 1)倾斜原因:map输出数据按key Hash的分配到reduce中,由于key分布不均匀.业务数据本身的特.建表时考虑不周.等原因 ...
- 【UE4 C++】 UnrealPak 与 Pak 的制作、挂载、加载
简介 通过 UnrealPak,可以将资源打包成 Pak 文件 Pak文件是UE4游戏生成的数据包文件. Pak 之前一般先有 Cooked 步骤,将资源烘焙为对应平台支持的资源 一般打包后的项目使用 ...
- Scrum Meeting 0505
零.说明 日期:2021-5-5 任务:简要汇报两日内已完成任务,计划后两日完成任务 一.进度情况 组员 负责 两日内已完成的任务 后两日计划完成的任务 qsy PM&前端 完成邮箱注册页面功 ...
- BUAA_2020_软件工程_结对项目作业
项目 内容 这个作业属于哪个课程 班级博客 这个作业的要求在哪里 作业要求 我在这个课程的目标是 掌握软件工程的思路方法 这个作业在哪个具体方面帮助我实现目标 学习结对编程 教学班级 006 项目地址 ...
- SpringCloud 2020.0.4 系列之服务降级
1. 概述 老话说的好:做人要正直,做事要正派,胸怀坦荡.光明磊落,才会赢得他人的信赖与尊敬. 言归正传,之前聊了服务间通信的组件 Feign,今天我们来聊聊服务降级. 服务降级简单的理解就是给一个备 ...
- seata整合nacos完成分布式的部署
seata整合nacos完成分布式的部署 一.背景 二.部署机器 三.部署步骤 1.在seata上创建命名空间 2.下载对应版本的seata 3.单机启动 1.修改seata配置文件 1.修改注册中心 ...
- 2021.7.27考试总结[NOIP模拟25]
罕见的改完了题 T1 random 一堆概率,一堆函数,一堆递归,一眼不可做, 但它只有一个参数,所以.. 熠神本着"只有20太难看"的心态,通过样例三个出规律,口胡了一波$\fr ...
- 主集天线和分集天线——4G天线技术
主集天线和分集天线 分集接收技术是一项主要的抗衰落技术,可以大大提高多径衰落信道传输下的可靠性,在实际的移动通信系统中,移动台常常工作在城市建筑群或其他复杂的地理环境中,而且移动的速度和方向是任意的. ...
- git commit--fatal: unable to auto-detect email address
git commit的时候报错 *** Please tell me who you are. Run git config --global user.email "you@example ...