您的位置:首页 > 其它

BZOJ 1142: [POI2009]Tab 模拟

2016-11-12 14:43 260 查看
时空隧道

先%YOUSIKI…

我看到这道题第一想法是判断每一行每一列中元素是否相同…什么排序乱搞…复杂度n^2lgn…

然而YOUSIKI童鞋发现了n^2的算法…%%%OTZ

两个矩阵可以相同的首要条件是矩阵中的元素相同…

然后再考虑如果两个元素在同一行…无论怎么变换都一定在同一行…

并且矩阵中元素互不相同…所以我们记录一下每一个元素分别在两个矩阵中的位置…然后匹配每一行每一列…判断是否有矛盾…

代码如下:

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int maxn=1000+5,maxm=2000000+5;
int cas,n,m,mp[2][maxn][maxn],r[maxn],c[maxn];
struct M{
int x,y;
}s[2][maxm];
signed main(void){
scanf("%d",&cas);
while(cas--){
int flag=0;
scanf("%d%d",&n,&m);
memset(r,-1,sizeof(r));
memset(c,-1,sizeof(c));
for(int k=0;k<=1;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
scanf("%d",&mp[k][i][j]),mp[k][i][j]+=1000000,s[k][mp[k][i][j]].x=i,s[k][mp[k][i][j]].y=j;
for(int i=1;i<=n;i++){
if(flag)
break;
for(int j=1;j<=m;j++){
int x=s[1][mp[0][i][j]].x,y=s[1][mp[0][i][j]].y;
if(r[i]==-1||r[i]==x)
r[i]=x;
else{
puts("NIE");flag=1;
break;
}
if(c[j]==-1||c[j]==y)
c[j]=y;
else{
puts("NIE");flag=1;
break;
}
}
}
if(!flag)
puts("TAK");
}
return 0;
}


by >_< NeighThorn
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: