[Codeforces #615 div3]1294E Obtain a Permutation
Before the Beginniing
本文为 Clouder 原创文章,原文链接为Click,转载时请将本段放在文章开头显眼处。如进行了二次创作,请明确标明。
由本人转载于博客园。
题意分析
Codeforces题目链接
给出一个 \(n \times m\) 的矩阵,给出两种操作:
- 将某一列整体向上移动一位。
- 修改某一个位置的值。
求最少要多少次操作,使得矩阵成为如下形式:
思路
很容易发现,每一列的操作都是独立的。
那么就一列列处理即可。
问题转化为如何求一列变为目标形式的最少操作次数。
而修改和平移是不冲突的,可以直接考虑先平移再修改。
暴力枚举法
于是得到一个很直观的思路,枚举向上移动多少次,再检查每一个数计算要修改多少次达到目标状态。
这样每列的复杂度是 \(O(n^2)\) 的,总复杂度显然不可接受。
计算位置法
考虑每列要修改多少次受什么影响。
在向上平移特定距离之后,如果平移后有位置刚好对应上,则不需要修改。
每个位置数确定之后,其能对应的位置也确定了,可以直接计算出在平移几格时的情况该位置不需要修改。
比如图中第一列,第二行如果有一个数 \(1\),可以直接通过计算得出其应当在的位置为第一行,于是在平移一格时的情况它不用修改,记录下来即可。
那么整体把矩阵扫一遍处理即可,时间复杂度 \(O(nm)\),可以通过。
解法
还是有一些细节的。
首先不能直接开 \(nm\) 大小的数组,会爆空间,这里使用了 vector 来处理。
而 \(s[i]\) 代表的是 向上平移 \(i\) 格时有多少个位置不需要修改。
那么操作步数可以通过平移格数和修改数计算出。
这里的数组 \(s\) 直接滚动优化掉一维,注意使用循环清空,就不会清空不使用的部分,而用 memset 会超时。
计算新位置建议自己画图手推一下,代个例子进去。
由于使用 vector,下标从 \(0\) 开始了,按个人习惯来吧。
代码
#include <cstdio>
#include <vector>
using namespace std;
inline int read()
{
static char c;
int r = 0;
for (c = getchar(); c > '9' || c < '0'; c = getchar());
for (; c >= '0' && c <= '9'; r = (r << 1) + (r << 3) + (c ^ 48), c = getchar());
return r;
}
const int maxn = 2e5 + 100;
int n, m;
vector<int> a[maxn];
int s[maxn];
int ans;
int main()
{
n = read();
m = read();
for (int i = 0; i < n; ++i)
for (int j = 0; j < m; ++j)
a[i].push_back(read());
int maxx = n * m;
for (int j = 0; j < m; ++j)
{
for (int i = 0; i < n; ++i)
s[i] = 0;
for (int i = 0; i < n; ++i)
{
if (a[i][j] > maxx || a[i][j] < j || ((a[i][j] - j - 1) % m) != 0)
continue;
int p = (a[i][j] - j - 1) / m;
if (i >= p)
s[i - p]++;
else
s[i + n - p]++;
}
int res = 1 << 30;
for (int i = 0; i < n; ++i)
if (n - s[i] + i < res)
res = n - s[i] + i;
ans += res;
}
printf("%d\n", ans);
return 0;
}
[Codeforces #615 div3]1294E Obtain a Permutation的更多相关文章
- Codeforces 1294E - Obtain a Permutation
题目大意: 给定一个n*m的矩阵 可以更改任意一个位置的值 也可以选择一整列全部往上移动一位,最上方的数移动到最下方 问最少操作多少次可以把这个矩阵移动成 1 2 3 ... m m+1 m+2 m+ ...
- Codeforces #550 (Div3) - G.Two Merged Sequences(dp / 贪心)
Problem Codeforces #550 (Div3) - G.Two Merged Sequences Time Limit: 2000 mSec Problem Description T ...
- Codeforces 1091D New Year and the Permutation Concatenation 找规律,数学 B
Codeforces 1091D New Year and the Permutation Concatenation https://codeforces.com/contest/1091/prob ...
- codeforces 615 D. Multipliers (数论 + 小费马定理 + 素数)
题目链接: codeforces 615 D. Multipliers 题目描述: 给出n个素数,这n个素数的乘积等于s,问p的所有因子相乘等于多少? 解题思路: 需要求出每一个素数的贡献值,设定在这 ...
- codeforces 615 B. Longtail Hedgehog (DFS + 剪枝)
题目链接: codeforces 615 B. Longtail Hedgehog (DFS + 剪枝) 题目描述: 给定n个点m条无向边的图,设一条节点递增的链末尾节点为u,链上点的个数为P,则该链 ...
- codeforces #579(div3)
codeforces #579(div3) A. Circle of Students 题意: 给定一个n个学生的编号,学生编号1~n,如果他们能够在不改变顺序的情况下按编号(无论是正序还是逆序,但不 ...
- U - Obtain a Permutation CodeForces - 1294E 思维
题解: 注意每一列与每一列之间互不影响,所以贪心地求出没一列的最小操作值,然后累加起来. 怎么求没一列的最小值呢?维护一个数组same表示其中same[i]=j表示将该序列向上翻滚i次有j个元素归位, ...
- Twist the Permutation 数列的轮换题 Codeforces 776 div3
这是一道比较经典的将数列中的数字轮换的题目,我们先看题干: 题干分析:先浅浅地分析一下题目是要我们干什么,我们会默认有一个已经升序排序地1~n的排列,然后我们会给定一个新排列是在原有排列的基础上进行o ...
- Educational Codeforces Round 7 D. Optimal Number Permutation 构造题
D. Optimal Number Permutation 题目连接: http://www.codeforces.com/contest/622/problem/D Description You ...
随机推荐
- @ModelAttribute与@RequestBody的区别
一.@ModelAttribute与@RequestBody的区别 @ModelAttribute与@RequestBody都是用来注解解析前端发来数据,并自动对应到所定义的字段名称. 这里先放结论, ...
- Emprie 使用基础笔记
0x01 简介 empire 是一个后渗透攻击框架,具有加密通信和灵活框架的功能.Empire可以在不需要Powershell.exe的情况下执行PowerShell代理,后期利用的模块很强大,如sc ...
- 【代码学习】PYTHON中的静态方法和类方法
一.类方法 是类对象所拥有的方法,需要用修饰器@classmethod来标识其为类方法,对于类方法,第一个参数必须是类对象,一般以cls作为第一个参数(当然可以用其他名称的变量作为其第一个参数,但是大 ...
- centosflask+uWSGI+nginx部署
centosflask+uWSGI+nginx部署 1. 概念 Flask自带webserver--Werkzeug,可以搭建服务,运行网站.但在开发时,一般会用专业的--uWSGI. 另外 ...
- [转]JDK1.0到12各版本新特性
原文链接 JDK Version 1.0 1996-01-23 Oak(橡树) 初代版本,伟大的一个里程碑,但是是纯解释运行,使用外挂JIT,性能比较差,运行速度慢.JDK Version 1.1 1 ...
- 吴裕雄--天生自然Numpy库学习笔记:NumPy 广播(Broadcast)
广播(Broadcast)是 numpy 对不同形状(shape)的数组进行数值计算的方式, 对数组的算术运算通常在相应的元素上进行. 如果两个数组 a 和 b 形状相同,即满足 a.shape == ...
- java web第一次课堂测试1
---恢复内容开始--- 要求如图: 本程序包括四个文件,一个显示界面的jsp文件,一个dao层文件,一个servlet层文件 一个连接数据库的文件 下面依次附上代码: 前端界面: <%@ pa ...
- Ubuntu配置Python开发环境(PyCharm、Tensorflow)
安装JDK: https://www.cnblogs.com/wanghuixi/p/9837229.html 安装Anaconda: 安装PyCharm: https://www.cnblogs.c ...
- JS动态添加删除html
本功能要求是页面传一个List 集合给后台而且页面可以动态添加删除html代码需求如下: 下面是jsp页面代码 <%@ page language="java" pageEn ...
- 2019年 我的phper之路,时光没了,头发还在
前言 曾经我认为最快的是麦迪的第一步,后来我觉得 7 酱逃跑速度更快,现在我懂了,原来我们都在跟时间赛跑. 年底了,给自己一个 "交代" 吧 2019 的我 2019 年写了 很多 ...