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的更多相关文章
随机推荐
- Nginx报错汇总
1. Nginx 无法启动解决方法 在查看到 logs 中报了如下错误时: 0.0.0.0:80 failed (10013: An attempt was made to access a ...
- /proc/cpuinfo和/proc/meminfo来查看cpu信息与内存信息
#一般情况下使用root或者oracle用户查都可以. # 总核数 = 物理CPU个数 X 每颗物理CPU的核数 # 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数 --查 ...
- html常用标签详解2-图片标签详解
<img /> 1.图片标签的属性 图片标签属于行内块元素,它自身的属性有一下几个,听我娓娓道来: src:图片资源的路径(resourse),可以使绝对路径,也可以是相对路径 绝对路径: ...
- c++类成员函数的重载和覆盖有什么区别
1.成员函数被重载的特征: (1)相同的范围(在同一个类中): (2)函数名字相同: (3)参数不同: (4)virtual 关键字可有可无. 2.覆盖是指派生类函数覆盖基类函数,特征是: (1)不同 ...
- Node.js学习(Node.js基础)
1.开发环境搭建 v8引擎是作为解析JavaScript程序来运行的 nodejs是一个高性能的,第一个体现在他的JavaScript解析速度很快,v8引擎性能很高,第二个事件驱动和非阻塞 2.全局对 ...
- 利用PHP获取访客IP、地区位置、浏览器及来源页面等信息
这篇文章主要介绍了利用PHP获取访客IP.地区位置.浏览器及来源页面等信息的相关资料,文中给出了详细的示例代码供大家参考学习,对大家具有一定的参考借鉴价值,需要的朋友们下面来一起看看吧. 前言 本文中 ...
- poj1961
poj1961主要是考察对next数组的理解,abaabaabaaba abaabaabaabaabaaba错开的部分便是循环节 7月29日更 如果n%(n-kmp[k])==0,那么n-kmp[k] ...
- MySQL系列(九)--InnoDB索引原理
InnoDB在MySQL5.6版本后作为默认存储引擎,也是我们大部分场景要使用的,而InnoDB索引通过B+树实现,叫做B-tree索引.我们默认创建的 索引就是B-tree索引,所以理解B-tree ...
- Boost.Asio基础
http://www.voidcn.com/article/p-exkmmuyn-po.html http://www.voidcn.com/article/p-xnxiwkrf-po.html ht ...
- 学习线程池源码--ThreadPoolExecutor
1 创建ThreadPoolExecutor ThreadPollExecutor有四个构造函数,但本质上都是调用这一个构造函数. public ThreadPoolExecutor(int core ...