bnu 34981 A Matrix(构造)

题目链接:bnu 34981 A Matrix

题目大意:假定有一序列,按照题目中给定的算法构造出一张二维表,现在题目给定一张二维表,要求求出序列,要求序列的倒置的字典序最大。

解题思路:构造,对于每一层来说,一定是递增的,根据算法可以得出;并且一个数被换到下一行,一定是因为有序列后面有小于自己的数,所以每一层从最后一个数开始匹配,找到上一层中比自己小的最大数字,假定是该数导致当前数被换到下一行,注意一个数只能让一个数被换到下一行。所以有几种是找不到对应序列,要输出-1.

  • 一行中的数不是递增的。
  • 当前行的数不能一一对应上一行的数
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>

using namespace std;
const int N = 1e5+5;

bool flag;
int n, m, c, mv, f[N], r[N], ans[N];
vector<int> g[N];

int getfar(int x) {
    return x == f[x] ? x : f[x] = getfar(f[x]);
}

void init () {
    scanf("%d%d", &n, &m);

    flag = false;
    for (int i = 0; i <= n; i++)
        r[i] = f[i] = i;
    for (int i = 0; i < m; i++)
        g[i].clear();

    int t;
    for (int i = 0; i < m; i++) {
        scanf("%d", &t);
        int a, pre = 0;

        for (int j = 0; j < t; j++) {
            scanf("%d", &a);
            g[i].push_back(a);
            if (a < pre)
                flag = true;
            pre = a;
        }
    }
}

bool insert (int x, int d) {

    for (int j = mv-1; j >= 0; j--) {
        if (g[d][j] < x) {
            int p = getfar(g[d][j]);
            f[p] = x;
            r[p] = x;
            mv = j;
            return true;
        }
    }
    return false;
}

void put(int x) {
    ans[c--] = x;
    if (r[x] != x)
        put(r[x]);
}

void solve () {

    for (int i = m-1; i; i--) {
        int t = g[i].size();

        mv = g[i-1].size();

        for (int j = t-1; j >= 0; j--)
            if (!insert(g[i][j], i-1)) {
                flag = true;
                return;
            }
    }

    c = n;
    int t = g[0].size();
    for (int i = t-1; i >= 0; i--)
        put(g[0][i]);
}

int main () {
    int cas;
    scanf("%d", &cas);
    for (int i = 1; i <= cas; i++) {
        init ();

        printf("Case #%d: ", i);
        solve();

        if (flag) {
            printf("No solution\n");
        } else {
            for (int j = 1; j < n; j++)
                printf("%d ", ans[j]);
            printf("%d\n", ans[n]);
        }
    }
    return 0;
}

bnu 34981 A Matrix(构造)

时间: 2024-11-06 12:28:06

bnu 34981 A Matrix(构造)的相关文章

2014 BNU 邀请赛A题(构造问题)

A Matrix 题意:按照题目中给定的方法,给你一个矩阵,求出变换出该矩阵的字符串 思路:构造问题,在纸上多画几组就能发现,每次必须从上往下找到一条路径,最后输出这些路径,按照开头最大的最晚输出,找的过程中只要不断往下一层找一个大的即可,并且如果一开使有一行是非递增就是错误 代码: #include <stdio.h> #include <string.h> #include <vector> #include <map> using namespace

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 * Descrip

hdu 5015 233 Matrix(构造矩阵)

http://acm.hdu.edu.cn/showproblem.php?pid=5015 因为是个二维的递推式,当时没有想到可以这样构造矩阵.从列上看,当前这一列都是由前一列递推得到.根据这一点来构造矩阵.令b[i]代表第i列,是一个(n+2)*1的矩阵,即b[1] = [1,233......],之所以在加了两行,是要从前一个矩阵b[i-1]得到b[i]中的第二个数2333...,再构造一个转换矩阵a,它是一个(n+2)*(n+2)的矩阵,那么a^(m-1) * b就是第m列. /* a矩

UVA 11149 Power of Matrix 构造矩阵

题目大意:意思就是让求A(A是矩阵)+A2+A3+A4+A5+A6+······+AK,其中矩阵范围n<=40,k<=1000000. 解题思路:由于k的取值范围很大,所以很自然地想到了二分法,用递归逐步将k二分(公式:A+A2+A3+A4+A5+A6 = A+A2+A3 + A3(A+A2+A3)), 这种方法只需要注意k是奇数的情况就可以了. 最坑的是第二种方法,根据矩阵的性质可以构造出来一个子矩阵,假如有矩阵B=|A  E| ,那么BK =|AK   E+ A+A2+A3+A4+A5+A

AGC 027D.Modulo Matrix(构造 黑白染色)

题目链接 \(Description\) 给定\(n\),要求构造一个\(n\times n\)的矩阵,矩阵内的元素两两不同,且任意相邻的两个元素\(x,y\),满足\(\max(x,y)\ \mathbb{mod}\ \min(x,y)\)等于一个非零常数. \(n\leq500,\ 1\leq 矩阵中的元素\leq10^{15}\). \(Solution\) https://blog.csdn.net/Tiw_Air_Op1721/article/details/82719507 orz!

python版蛇形填数

引 入 蛇形填数,一道经典有趣的算法入门题.这里用python来实现. 代码 vim snake.py #!/usr/bin/env python #-*- coding: utf-8 -*- #矩阵初始化函数 def genMatrix(rows,cols):       #用二维数组来代表矩阵     matrix = [[0 for col in range(cols)] for row in range(rows)]       for i in range(rows):        

hdu2243 ac自动机+矩阵连乘

http://acm.hdu.edu.cn/showproblem.php?pid=2243 Problem Description 背单词,始终是复习英语的重要环节.在荒废了3年大学生涯后,Lele也终于要开始背单词了. 一天,Lele在某本单词书上看到了一个根据词根来背单词的方法.比如"ab",放在单词前一般表示"相反,变坏,离去"等. 于是Lele想,如果背了N个词根,那这些词根到底会不会在单词里出现呢.更确切的描述是:长度不超过L,只由小写字母组成的,至少包

HDU - 5015 233 Matrix (矩阵构造)

Problem Description In our daily life we often use 233 to express our feelings. Actually, we may say 2333, 23333, or 233333 ... in the same meaning. And here is the question: Suppose we have a matrix called 233 matrix. In the first line, it would be

构造矩阵解决问题 【nyoj299 Matrix Power Series】

矩阵的又一个新用法,构造矩阵进行快速幂. 比如拿 nyoj299 Matrix Power Series 来说 给出这样一个递推式: S = A + A2 + A3 + - + Ak. 让你求s,A是一个矩阵,而k非常大.怎么办呢? 推理发现:Fn = A + A*F(n-1) 然后我们可以构造矩阵: (Fn ,1 ) =  (Fn-1 ,1) * (A,0.A,1) = (F1 , 1) * (A,0.A,1)^K-1 那么我们就可以用一个矩阵快速幂了. 下面是模板题目的代码: #includ