CF274D
One day when Lenny was at school his little brother was playing with Lenny's matrix in his room. He erased some of the entries of the matrix and changed the order of some of its columns. When Lenny got back home he was very upset. Now Lenny wants to recover his matrix.
Help him to find an order for the columns of the matrix so that it's possible to fill in the erased entries of the matrix to achieve a lovely matrix again. Note, that you can fill the erased entries of the matrix with any integers.
The first line of the input contains two positive integers n and m (1 ≤ n·m ≤ 105). Each of the next n lines contains m space-separated integers representing the matrix. An integer -1 shows an erased entry of the matrix. All other integers (each of them is between 0 and 109inclusive) represent filled entries.
If there exists no possible reordering of the columns print -1. Otherwise the output should contain m integers p1, p2, ..., pm showing the sought permutation of columns. So, the first column of the lovely matrix will be p1-th column of the initial matrix, the second column of the lovely matrix will be p2-th column of the initial matrix and so on.
3 3
1 -1 -1
1 2 1
2 -1 1
3 1 2
2 3
1 2 2
2 5 4
1 3 2
2 3
1 2 3
3 2 1
-1 加点 拓扑排序
//Serene
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn=2e5+10;
int n,m,tot; struct Node{
int pos,x;
bool operator <(const Node& b) const{return x<b.x;}
}node[maxn]; int aa,ff;char cc;
int read() {
aa=0;cc=getchar();
while((cc<'0'||cc>'9')&&cc!='-') cc=getchar();
if(cc=='-') ff=-1,cc=getchar(); else ff=1;
while(cc>='0'&&cc<='9') aa=aa*10+cc-'0',cc=getchar();
return aa*ff;
} int fir[maxn],nxt[2*maxn],to[2*maxn],rd[maxn],e=0;
void add(int x,int y) {
to[++e]=y;nxt[e]=fir[x];fir[x]=e;
rd[y]++;
} int zz[maxn],s=1,t=0;
void get_ans() {
int x,y;
for(int i=1;i<=m;++i) if(!rd[i]) zz[++t]=i;
while(s<=t) {
x=zz[s];
for(y=fir[x];y;y=nxt[y]) {
rd[to[y]]--;
if(!rd[to[y]]) zz[++t]=to[y];
}
s++;
}
if(t<tot) printf("-1");
else for(int i=1;i<=t;++i) if(zz[i]<=m) printf("%d ",zz[i]);
} int main() {
n=read();m=read();
int pos,last;
tot=last=m;
for(int i=1;i<=n;++i) {
for(int j=1;j<=m;++j) node[j].pos=j,node[j].x=read();
sort(node+1,node+m+1);
pos=1;
while(node[pos].x==-1&&pos<=m) ++pos;
if(pos>=m) continue;
add(node[pos].pos,++tot);pos++;
while(pos<=m&&node[pos-1].x==node[pos].x) add(node[pos].pos,tot),++pos;
for(;pos<=m;++pos) {
if(node[pos].x!=node[pos-1].x) tot++;
add(node[pos].pos,tot);
add(tot-1,node[pos].pos);
}
last=tot;
}
get_ans();
return 0;
}
CF274D的更多相关文章
随机推荐
- Windows API 第15篇 GetVolumeInformation 获取磁盘卷(驱动器)信息
先看定义:BOOL GetVolumeInformation( [IN] LPCTSTR lpRootPathName, // root directory 卷所在的根目 ...
- 主从复制系列C
近日接到一个故障,主从异步方式,主 crash后,从不可用,检查发现从机Read_Master_Log_Pos与Exec_Master_Log_Pos不一致,似乎还有binlog在回放中,HA在等回放 ...
- GDKOI2018游记 and 总结
前言 前年NOIP普及组考炸了,没考进一等奖,导致去年只能参加NOIP普及组. 去年NOIP普及组考炸了,幸好进了一等奖. 今年的GDKOI名额是难得的,这是我第一次参加Day>=2的比赛. 第 ...
- Python3.5 安装 & hello world
1.下载安装python https://www.python.org/downloads/release/python-364/ 2.安装成功运行 python shell 3.或者cmd => ...
- 第三章 Odoo 12 开发之创建第一个 Odoo 应用
Odoo 开发通常都需要创建自己的插件模块.本文中我们将通过创建第一个应用来一步步学习如何在 Odoo 中开启和安装这个插件.我们将从基础的开发流学起,即创建和安装新插件,然后在开发迭代中更新代码来进 ...
- 表碎片处理方法OPTIMIZE
来看看手册中关于 OPTIMIZE 的描述: OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ... 如果您已经删除 ...
- Python - 集合与元素之集合定义和基本操作方法
集合(set) 定义:由不同元素组成的集合,集合中是一组无序排列可hash的值(不可变的值)例如数字.字符串.元组,可以作为字典的key 定义集合: # 定义集合 s = {1, 2, 3, 3, 3 ...
- python-基础-练习和面试题
给程序传参数 import sys print(sys.argv) 运行结果: 列表推导式 所谓的列表推导式,就是指的轻量级循环创建列表 1. 基本的方式 2. 在循环的过程中使用if 3. 2个fo ...
- jQuery Validate扩展验证方法 (zhangxiaobin)
/***************************************************************** jQuery Validate扩展验证方法 (zhangxiaob ...
- spring源码学习之bean的加载(二)
这是接着上篇继续写bean的加载过程,好像是有点太多了,因为bean的加载过程是很复杂的,要处理的情况有很多,继续... 7.创建bean 常规的bean的创建时通过doCreateBean方法来实现 ...