BNUOJ 34981 A Matrix

BNUOJ 34981 A Matrix

题目地址:BNUOJ 34981

题意:

给你一个把一个排列放到矩阵里面的算法和矩阵,要你从矩阵写出排列。

如果答案有多个,输出翻转后字典序最大的那个。

分析:

想了半天只能想到链表版的,而且很可能TLE,看了帆神的题解后豁然开朗..Orz..

代码:

/*
*  Author:      illuz <iilluzen[at]gmail.com>
*  File:        a.cpp
*  Create Date: 2014-05-29 21:05:38
*  Descripton:
*/

#include <cstdio>
#include <vector>
using namespace std;

const int N = 1e5 + 10;
int t, n, m, p[N], tmp, ans[N], cnt;
bool flag;
vector<int> v[N];

void dfs(int r, int val) {
	if (r >= m || p[r] - 1 < 0 || v[r][p[r] - 1] < val)
		return;
	ans[cnt++] = v[r][p[r] - 1];
	dfs(r + 1, v[r][p[r] - 1]);
	p[r]--;
}

int main()
{
	scanf("%d", &t);
	for (int cas = 1; cas <= t; cas++) {
		printf("Case #%d:", cas);

		scanf("%d%d", &n, &m);
		flag = false;

		for (int i = 0; i < m; i++) {
			v[i].clear();
			scanf("%d", &p[i]);

			for (int j = 0; j < p[i]; j++) {
				scanf("%d", &tmp);
				v[i].push_back(tmp);
				if (j > 0 && v[i][j] < v[i][j - 1])
					flag = true;
			}

			if (i > 0 && v[i][0] < v[i - 1][0])
				flag = true;
		}

		if (flag) {
			puts(" No solution");
			continue;
		}

		cnt = 0;
		for (int i = p[0] - 1; i >= 0; i--) {
			ans[cnt++] = v[0][i];
			dfs(1, v[0][i]);
		}

		if (cnt != n) {
			puts(" No solution");
			continue;
		}
		for (int i = cnt - 1; i >= 0; i--)
			printf(" %d", ans[i]);
		puts("");
	}
	return 0;
}

BNUOJ 34981 A Matrix

时间: 2024-10-05 11:42:33

BNUOJ 34981 A Matrix的相关文章

bnu 34981 A Matrix(构造)

题目链接:bnu 34981 A Matrix 题目大意:假定有一序列,按照题目中给定的算法构造出一张二维表,现在题目给定一张二维表,要求求出序列,要求序列的倒置的字典序最大. 解题思路:构造,对于每一层来说,一定是递增的,根据算法可以得出:并且一个数被换到下一行,一定是因为有序列后面有小于自己的数,所以每一层从最后一个数开始匹配,找到上一层中比自己小的最大数字,假定是该数导致当前数被换到下一行,注意一个数只能让一个数被换到下一行.所以有几种是找不到对应序列,要输出-1. 一行中的数不是递增的.

【BNUOJ19500】 Matrix Decompressing

https://www.bnuoj.com/v3/problem_show.php?pid=19500 (题目链接) 题意 给出一个R行C列的正整数矩阵,设前${A_i}$项为其前i行所有元素之和,${B_i}$项为其前i列所有元素之和,已知R,C,A,B,找出一个满足条件的矩阵.其中每个元素都是1~20的正整数. Solution 看到这类矩阵形的题目,首先就要考虑构造二分图,左集代表行,右集代表列,其中每一条边代表一个点. 这样构完图后,我们发现可以使用有上下界的网络流来解决这个问题.添加源

bnuoj 34985 Elegant String

题目链接:http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid=34985 We define a kind of strings as elegant string: among all the substrings of an elegant string, none of them is a permutation of "0, 1,…, k". Let function(n, k) be the number of elegant s

hdu 5015 233 Matrix (矩阵快速幂)

题意: 有一种矩阵,它的第一行是这样一些数:a  0,0 = 0, a 0,1 = 233,a 0,2 = 2333,a 0,3 = 23333... 除此之外,在这个矩阵里, 我们有 a i,j = a i-1,j +a i,j-1( i,j ≠ 0).现在给你 a 1,0,a 2,0,...,a n,0, 你能告诉我a n,m 是多少吗? n,m(n ≤ 10,m ≤ 10 9)输出 a n,m mod 10000007. 思路:首先我们观察n和m的取值范围,会发现n非常小而m却非常大,如果

【数组】Spiral Matrix II

题目: Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order. For example,Given n = 3, You should return the following matrix: [ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ] 思路: 本质上和上一题是一样的,这里我们要用数字螺旋的去填充矩阵.同理,我们也是逐个环

Spiral Matrix(LintCode)

Spiral Matrix Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order. Example Given the following matrix: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] You should return [1,2,3,6,9,8,7,4,5]. 难得的一次AC! 虽然感觉题

LeetCode:Spiral Matrix II - 将元素1-n^2以螺旋序填充到矩阵

1.题目名称 Spiral Matrix(螺旋输出矩阵中的元素) 2.题目地址 https://leetcode.com/problems/spiral-matrix-ii/ 3.题目内容 英文:Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order. 中文:给出一个整数n,生成一个矩阵,使用数字1到n^2以螺旋顺序填充这个矩阵 例如:给出n=3,则生成如下矩阵:

LeetCode:Spiral Matrix - 螺旋输出矩阵中的元素

1.题目名称 Spiral Matrix(螺旋输出矩阵中的元素) 2.题目地址 https://leetcode.com/problems/spiral-matrix/ 3.题目内容 英文:Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order. 中文:给出一个m行n列的矩阵,以螺旋顺序返回矩阵中的所有元素. 例如:现有矩阵如下: [  [ 1,

HDU 2686 Matrix(最大费用流)

Matrix Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1890    Accepted Submission(s): 1005 Problem Description Yifenfei very like play a number game in the n*n Matrix. A positive integer numbe