【描述】

给出一个表格,N 行 M 列,每个格子有一个整数,有些格子是空的。现在需要你

来做出一些调整,使得每行都是非降序的。这个调整只能是整列的移动。

【输入】

第一行两个正整数 N 和 M。

接下来 N 行,每行 M 个整数,-1 表示这个格子是空的,其他的整数都在 [0, 10^9]范围,表示格子的数字。

【输出】

若无解,输出 -1;

否则输出任意一个解,即一行 M 个正整数 p1, p2, · · · , pm,表示可以把初始表格的 pi 列,放在新表格的第 i 列,以得到一个合法的表格。

【样例输入 1】

3 3

-1 -1 -1

2 1 2

2 -1 1

【样例输出 1】

2 3 1

【样例输入 2】

2 2

1 2

2 1

【样例输出 2】

-1

对于 20% 的数据,满足 1 ≤ N ≤ 8,1 ≤ M ≤ 8。

对于 60% 的数据,满足 1 ≤ N × M ≤ 2 × 10^3。

对于 100% 的数据,满足 1 ≤ N × M ≤ 10^5。


听说是最难的一道,但被xly大佬用爆搜跑过去了(能把spj卡爆太强了%%%)。

正解貌似很好想,题目无非就是让我们判定一堆列的相对关系,这个可以用有向边来表示,这样的话如果出现环就说明情况不合法。

但是会有一堆相同的数字出现,如何处理?

我们对于一堆相同的数字建一个虚点,然后将这些数字给它连边就行了。

代码:

#include<bits/stdc++.h>
#define N 1000005
using namespace std;
inline int read(){
    int ans=0,w=1;
    char ch=getchar();
    while(!isdigit(ch)){if(ch=='-')w=-1;ch=getchar();}
    while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
    return ans*w;
}
int n,m,ans[N],first[N],cnt=0,tot=0,hd,tl,du[N];
struct edge{int v,next;}e[N*20];
struct Node{int v,id;}q[N];
bool vis[N],in[N];
inline bool cmp(Node a,Node b){return a.v<b.v;}
inline void add(int u,int v){e[++cnt].v=v,e[cnt].next=first[u],first[u]=cnt,++du[v];}
inline bool bfs(int s){
    queue<int>q;
    q.push(s);
    while(!q.empty()){
        int x=q.front();
        q.pop();
        in[x]=true;
        if(x>=1&&x<=m)ans[++tot]=x;
        for(int i=first[x];~i;i=e[i].next){
            int v=e[i].v;
            --du[v];
            if(!du[v])q.push(v);
        }
    }
    bool f=true;
    for(int i=1;i<=m;++i){
        if(!vis[i])ans[++tot]=i;
        else if(!in[i]){f=false;break;}
    }
    return f;
}
int main(){
//  freopen("table.in","r",stdin);
//  freopen("table.out","w",stdout);
    memset(first,-1,sizeof(first));
    int t,s=0;
    n=read(),t=m=read();
    for(int tt=1;tt<=n;++tt){
        ++t,add(s,t);
        for(int j=1;j<=m;++j)q[j].id=j,q[j].v=read();
        sort(q+1,q+m+1,cmp);
        int pos=1;
        while(q[pos].v==-1)++pos;
        hd=tl=pos;
        for(int j=pos;j<=m;++j)vis[q[j].id]=1;
        while(pos<=m){
            while(q[pos+1].v==q[pos].v&&pos<m)++pos,++tl;
            for(int i=hd;i<=tl;++i)add(t,q[i].id),add(q[i].id,t+1);
            ++t,hd=tl=++pos;
        }
    }
    bool f=bfs(s);
    if(!f){puts("-1");return 0;}
    for(int i=1;i<=m;++i)cout<<ans[i]<<' ';
    return 0;
}

2018.08.29 NOIP模拟 table(拓扑排序+建图优化)的更多相关文章

  1. 2018.08.29 NOIP模拟 movie(状压dp/随机化贪心)

    [描述] 小石头喜欢看电影,选择有 N 部电影可供选择,每一部电影会在一天的不同时段播 放.他希望连续看 L 分钟的电影.因为电影院是他家开的,所以他可以在一部电影播放过程中任何时间进入或退出,当然他 ...

  2. 2018.08.29 NOIP模拟 pmatrix(线性筛)

    [问题描述] 根据哥德巴赫猜想(每个不小于 6 的偶数都可以表示为两个奇素数之和),定义 哥德巴赫矩阵 A 如下:对于正整数对(i,j),若 i+j 为偶数且 i,j 均为奇素数,则 Ai,j = 1 ...

  3. 2018.08.22 NOIP模拟 string(模拟)

    string [描述] 给定两个字符串 s,t,其中 s 只包含小写字母以及*,t 只包含小写字母. 你可以进行任意多次操作,每次选择 s 中的一个*,将它修改为任意多个(可以是 0 个)它的前一个字 ...

  4. 2018.06.29 NOIP模拟 Gcd(容斥原理)

    Gcd 题目背景 SOURCE:NOIP2015-SHY-2 题目描述 给出n个正整数,放入数组 a 里. 问有多少组方案,使得我从 n 个数里取出一个子集,这个子集的 gcd 不为 1 ,然后我再从 ...

  5. 2018.08.30 NOIP模拟 wall(模拟)

    [问题描述] 万里长城是中国强大的标志,长城在古代的用途主要用于快速传递军事消息和抵御 外敌,在长城上的烽火台即可以作为藏兵的堡垒有可以来点燃狼烟传递消息. 现在有一段 万里长城,一共有 N 个烽火台 ...

  6. 2018.08.19 NOIP模拟 change(简单模拟)

    Change 题目背景 SOURCE:NOIP2015-SHY-10 题目描述 Alice 和 Bob 又聚在一起了!他们已经厌倦了取石子游戏,现在他们热衷于切题.于是,Alice 找到了一道题让 B ...

  7. 2018.06.29 NOIP模拟 Minimum(最小生成树)

    Minimum 题目背景 SOURCE:NOIP2015-SHY-2 题目描述 给出一幅由 n 个点 m 条边构成的无向带权图. 其中有些点是黑点,另外点是白点. 现在每个白点都要与他距离最近的所有黑 ...

  8. 2018.06.29 NOIP模拟 1807(简单递推)

    1807 题目背景 SOURCE:NOIP2015-SHY-2 题目描述 给出一个由数字('0'-'9')构成的字符串.我们说一个子序列是好的,如果他的每一位都是 1.8.0.7 ,并且这四个数字按照 ...

  9. 2018.06.29 NOIP模拟 繁星(前缀和)

    繁星 [问题描述] 要过六一了,大川正在绞尽脑汁想送给小伙伴什么礼物呢.突然想起以前拍过一张夜空中的繁星的照片,这张照片已经被处理成黑白的,也就是说,每个像素只可能是两个颜色之一,白或黑.像素(x,y ...

随机推荐

  1. leetcode453

    public class Solution { public int MinMoves(int[] nums) { var list = nums.OrderBy(x => x).ToList( ...

  2. UI5-文档-4.11-Pages and Panels

    在完成了应用程序结构的所有工作之后,是时候改进我们的应用程序的外观了.在这一步中,您还将了解控件聚合. Preview A panel is now displaying the controls f ...

  3. jsp页面重定向

    <%@ page language="java" contentType="text/html; charset=UTF-8"    pageEncodi ...

  4. express + mongodb 搭建一个简易网站 (五)

    前面已经将导航中的“所有宝贝”页面连上了mongodb,现在我们就把其他的页面脸上数据库,将整个网站全部实现. 打开routes文件,找到jacket.js,将里面的代码修改如下: var expre ...

  5. Spinnaker 介绍

    功能: 无论目标环境如何,Spinnaker 部署优势始终如一,它的功能如下: 通过灵活和可配置 Pipelines,实现可重复的自动化部署: 提供所有环境的全局视图,可随时查看应用程序在其部署 Pi ...

  6. linux下字符串的比较方式

    A="$1" B="$2"    #判断字符串是否相等 if [ "$A" = "$B" ];then echo &qu ...

  7. 图解Java常用数据结构(一)【转载】

    最近在整理数据结构方面的知识, 系统化看了下Java中常用数据结构, 突发奇想用动画来绘制数据流转过程. 主要基于jdk8, 可能会有些特性与jdk7之前不相同, 例如LinkedList Linke ...

  8. 13-前端不通路径同一个请求访问同一个页面时,有时样式没有加载出来(jss,image,css)

    通过如下方式访问同一个网站时,下面一个可以加载样式,而下面一个加载的页面却没有样式,思考良久没有想通,当时也忘记了用浏览器看下 css,js,image的请求路径,其实在前端页面里面我直接:  这样引 ...

  9. 10-多写一个@Autowired导致程序崩了

    再是javaweb实验六中,是让我们改代码,让它跑起来,结果我少注释了一个,导致一直报错,检查许久没有找到,最后通过代码替换逐步查找,才发现问题.

  10. 3.滑雪-深搜&dp

    //Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道载一个区域中最长底滑 ...