设为首页 加入收藏

TOP

bnu 34981 A Matrix(构造)
2015-07-24 05:53:49 来源: 作者: 【 】 浏览:7
Tags:bnu 34981 Matrix 构造

题目链接:bnu 34981 A Matrix

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

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

  • 一行中的数不是递增的。
  • 当前行的数不能一一对应上一行的数
    #include 
         
           #include 
          
            #include 
           
             #include 
            
              using namespace std; const int N = 1e5+5; bool flag; int n, m, c, mv, f[N], r[N], ans[N]; vector
             
               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; }
             
            
           
          
         
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇ViewPage+frament不预加载下一个F.. 下一篇UVA 756 - Biorhythms(数论)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: