zoukankan      html  css  js  c++  java
  • Codeforces 954C- Matrix Walk(思维+构造)

    题目链接:https://codeforces.com/problemset/problem/954/C
    CSDN食用链接:https://blog.csdn.net/qq_43906000/article/details/107855257

    There is a matrix A of size x × y filled with integers. For every (iin[1,x],jin[1,y]) , (A_{i, j} = y(i - 1) + j). Obviously, every integer from [1..xy] occurs exactly once in this matrix.

    You have traversed some path in this matrix. Your path can be described as a sequence of visited cells (a_1, a_2, ..., a_n) denoting that you started in the cell containing the number (a_1), then moved to the cell with the number (a_2), and so on.

    From the cell located in i-th line and j-th column (we denote this cell as (i, j)) you can move into one of the following cells:

    1.(i + 1, j) — only if i < x;
    2.(i, j + 1) — only if j < y;
    3.(i - 1, j) — only if i > 1;
    4.(i, j - 1) — only if j > 1.
    Notice that making a move requires you to go to an adjacent cell. It is not allowed to stay in the same cell. You don't know x and y exactly, but you have to find any possible values for these numbers such that you could start in the cell containing the integer a 1, then move to the cell containing (a_2) (in one step), then move to the cell containing (a _3) (also in one step) and so on. Can you choose x and y so that they don't contradict with your sequence of moves?

    Input
    The first line contains one integer number (n (1 ≤ n ≤ 200000)) — the number of cells you visited on your path (if some cell is visited twice, then it's listed twice).

    The second line contains (n) integers (a_1, a _2, ..., a_ n (1 ≤ a _i ≤ 10^9)) — the integers in the cells on your path.

    Output
    If all possible values of x and y such that (1 ≤ x, y ≤ 10^9) contradict with the information about your path, print NO.

    Otherwise, print YES in the first line, and in the second line print the values x and y such that your path was possible with such number of lines and columns in the matrix. Remember that they must be positive integers not exceeding (10^9).

    Examples
    Input
    8
    1 2 3 6 9 8 5 2
    Output
    YES
    3 3

    Input
    6
    1 2 1 2 5 3
    Output
    NO

    Input
    2
    1 10
    Output
    YES
    4 9

    Note
    The matrix and the path on it in the first test looks like this:
    https://vj.z180.cn/51d6378b93a1916c8a09390d66b9e6b2?v=1596345081
    Also there exist multiple correct answers for both the first and the third examples.

    题目大意:你需要构造一个矩阵的行数和列数来使得行走的方案合法,如果无法构造输出NO,否则输出YES,并输出行数和列数。行走的方案为上下左右,对于一个矩阵按1到(x*y)标号

    emmm,现在看来还是挺简单的,我们需要先求出它的列数,那么就先for一遍,如果两个数的间隔不是1的话那么说明他们是上下走的,直接(abs(a[i]-a[i-1])=len)就可以得出其列数,不过若下一次的间隔不是(1)也不是(len)的话,那么就是不合法的,直接break,然后检查一下是否有相邻的两个一样。这样就得出了一个矩阵的固定列数。

    接下来我们还需要检查的是相邻两个是1的情况,看看他们是否处于同一行,那么判断也很简单:((a[i]-1)/len==(a[i-1]-1)/len)

    以下是AC代码:

    #include <bits/stdc++.h>
    using namespace std;
    
    #define debug printf("debug
    ")
    const int mac=2e5+10;
    
    int a[mac];
    
    int main(int argc, char const *argv[])
    {
    	int n;
    	scanf ("%d",&n);
    	for (int i=1; i<=n; i++)
    		scanf ("%d",&a[i]);
    	int flag=0,len=1,mx=a[1];
    	for (int i=2; i<=n; i++){
    		if (a[i]==a[i-1]) {flag=1; break;}
    		if (abs(a[i]-a[i-1])!=1) {
    			if (len!=1 && abs(a[i]-a[i-1])!=len){flag=1; break;}
    			len=abs(a[i]-a[i-1]);
    		}
    		mx=max(mx,a[i]);
    	}
    	if (flag) {printf("NO
    "); return 0;}
    	if (len==1) {
    		printf("YES
    ");
    		printf("%d %d
    ",mx,len); return 0;
    	}
    	for (int i=2; i<=n; i++){
    		if (abs(a[i]-a[i-1])==1 && (a[i]-1)/len!=(a[i-1]-1)/len) {
    			flag=1; break;
    		}
    	}
    	if (flag) {printf("NO
    "); return 0;}
    	printf("YES
    ");
    	printf("%d %d
    ",mx/len+1,len);
    	return 0;
    }
    
    路漫漫兮
  • 相关阅读:
    ueditor问题解决
    Odoo内部视图格式——widget
    Odoo进销存业务学习笔记
    Odoo权限设置机制
    Odoo配置文件
    Odoo——self的使用
    Odoo 启动选项
    Yiiyii2.0将高级模板的入口文件移到根目录
    Xmanager xbrower 远程linux下的应用(pycharm phpstorm)
    mysql backup
  • 原文地址:https://www.cnblogs.com/lonely-wind-/p/13450882.html
Copyright © 2011-2022 走看看