BZOJ 1142: [POI2009]Tab 模拟
2016-11-12 14:43
260 查看
时空隧道
先%YOUSIKI…
我看到这道题第一想法是判断每一行每一列中元素是否相同…什么排序乱搞…复杂度n^2lgn…
然而YOUSIKI童鞋发现了n^2的算法…%%%OTZ
两个矩阵可以相同的首要条件是矩阵中的元素相同…
然后再考虑如果两个元素在同一行…无论怎么变换都一定在同一行…
并且矩阵中元素互不相同…所以我们记录一下每一个元素分别在两个矩阵中的位置…然后匹配每一行每一列…判断是否有矛盾…
代码如下:
by >_< NeighThorn
先%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
相关文章推荐
- BZOJ 1142 [POI2009]Tab 模拟
- BZOJ 1142 POI2009 Tab Hash
- BZOJ1142: [POI2009]Tab
- 【BZOJ1142】【POI2009】Tab 乱搞
- BZOJ 1142: [POI2009]Tab【并查集/hash
- BZOJ 1142: [POI2009]Tab
- [乱搞 暴力] BZOJ 1142 [POI2009]Tab
- bzoj 1142: [POI2009]Tab 乱搞
- Bzoj 1115: [POI2009]石子游戏Kam
- BZOJ1135 [POI2009]Lyz
- bzoj 1119: [POI2009]SLO 置换群
- 【BZOJ】3524 [Poi2014]Couriers && 【BZOJ】2223 [Coci 2009]PATULJCI 主席树
- bzoj 1138: [POI2009]Baj 最短回文路 bfs
- [BZOJ 1120]POI2009 str
- BZOJ 1115: [POI2009]石子游戏Kam
- BZOJ 1117: [POI2009]救火站Gas 贪心
- BZOJ 1141 POI2009 Slw
- 【bzoj1119】[POI2009]SLO
- [bzoj1115][POI2009]石子游戏Kam_博弈论_阶梯博弈
- [BZOJ3524] [Poi2014]Couriers/[BZOJ2223] [Coci 2009]PATULJCI