BZOJ 1142 [POI2009]Tab 模拟

题意:链接略

方法:模拟

解析:

首先如果您做过高三那么您一定清楚,一个矩阵通过任意行列变换后得到的矩阵满足一种性质:原来在哪一行的元素还在那一行,原来在哪一列的元素还在那一列。

并且行列内部元素可以任意交换。

所以暴力验证即可。

代码附带5K读入优化,怒艹BZOJrnk1

代码:

#include<cstdio>
#include<cstring>
#include<cctype>
#include<cstdarg>
#include <iostream>
#include <algorithm>
#ifdef __GNUC__
#include<unistd.h>
#endif
//#define UsingIOException
static class Scanner
{
    typedef double D;
    typedef unsigned int long II;
    typedef signed int long SI;
    typedef unsigned char S;
    typedef char C;
    typedef bool B;
    static II const ScL =16384,Eof =0xff;
#ifdef __GNUC__
    II const buffer;
#else
    FILE *const buffer;
#endif
    S ram[ScL],*begin,*end;
public:
#ifdef UsingIOException
    enum IOException
    {
        FileEof,TypeError
    };
#endif
#ifdef __GNUC__
#ifdef Fin
    Scanner(II const iobuffer=open(Fin,1)):buffer(iobuffer),begin(ram),end(ram)
#else
    Scanner(II const iobuffer=0):buffer(iobuffer),begin(ram),end(ram)
#endif
#else
#ifdef Fin
    Scanner(FILE *const iobuffer=fopen(Fin,"rb")):buffer(iobuffer),begin(ram),end(ram)
#else
    Scanner(FILE *const iobuffer=stdin):buffer(iobuffer),begin(ram),end(ram)
#endif
#endif
    {
    }
    ~Scanner(void)
    {
#ifdef __GNUC__
        close(buffer);
#else
        fclose(buffer);
#endif
    }
    II get(void)
    {
        if(begin==end)
        {
            begin=ram;
#ifdef __GNUC__
            if((end=(begin=ram)+read(buffer,ram,ScL))==ram)
#else
            if((end=(begin=ram)+fread(ram,1,ScL,buffer))==ram)
#endif
                return Eof;
        }
        return *begin++;
    }
    D getSD(void)
    {
        II j;
        while(isspace(j=get()));
        B neg=false;
        if(j==‘-‘)
        {
            neg=true;
            j=get();
        }
#ifdef UsingIOException
        if(!isdigit(j))
            throw j==Eof?FileEof:TypeError;
#endif
        SI i=j-‘0‘;
        while(isdigit(j=get()))
            i=(i<<3)+(i<<1)+(j-‘0‘);
        if(j==‘.‘)
        {
            D val=D(i),level=1.;
            while(isdigit(j=get()))
                val+=(level*=.1)*D(j-‘0‘);
            return neg?-val:val;
        }
        return neg?-i:i;
    }
    D getD(void)
    {
        II j;
        while(isspace(j=get()));
#ifdef UsingIOException
        if(!isdigit(j))
            throw j==Eof?FileEof:TypeError;
#endif
        II i=j-‘0‘;
        while(isdigit(j=get()))
            i=(i<<3)+(i<<1)+(j-‘0‘);
        if(j==‘.‘)
        {
            D val=D(i),level=1.;
            while(isdigit(j=get()))
                val+=(level*=.1)*D(j-‘0‘);
            return val;
        }
        return i;
    }
    SI getSI(void)
    {
        II j;
        while(isspace(j=get()));
        B neg=false;
        if(j==‘-‘)
        {
            neg=true;
            j=get();
        }
#ifdef UsingIOException
        if(!isdigit(j))
            throw j==Eof?FileEof:TypeError;
#endif
        SI i=j-‘0‘;
        while(isdigit(j=get()))
            i=(i<<3)+(i<<1)+(j-‘0‘);
        return neg?-i:i;
    }
    II getII(void)
    {
        II j;
        while(isspace(j=get()));
#ifdef UsingIOException
        if(!isdigit(j))
            throw j==Eof?FileEof:TypeError;
#endif
        II i=j-‘0‘;
        while(isdigit(j=get()))
            i=(i<<3)+(i<<1)+(j-‘0‘);
        return i;
    }
    II getS(void)
    {
        II j;
        while(isspace(j=get()));
#ifdef UsingIOException
        if(!isascii(j))
            throw j==Eof?FileEof:TypeError;
#endif
        return j;
    }
    C * getCS(C *p)
    {
        skip();
        while(!isspace(*p++=get()));
        *--p=‘\0‘;
        return p;
    }
    void skip(int (*const func)(int)=isspace)
    {
        while(func(get()));
        --begin;
    }
}scan;
static class Printer
{
    typedef unsigned int long II;
    typedef char C;
    static II const ScL =16384,Ral =100;
    C self[ScL+Ral],*sp,*const slimit;
    FILE *const buffer;
public:
#ifdef Fout
    Printer(FILE *const iobuffer=fopen(Fout,"wb")):sp(self),slimit(self+ScL),buffer(iobuffer)
#else
    Printer(FILE *const iobuffer=stdout):sp(self),slimit(self+ScL),buffer(iobuffer)
#endif
    {
    }
    ~Printer(void)
    {
        flush();
        fclose(buffer);
    }
    void flush(void)
    {
        fwrite(self,1,sp-self,buffer);
        sp=self;
    }
    void print(C const *const s,...)
    {
        va_list h;
        va_start(h,s);
        if((sp+=vsprintf(sp,s,h))>=slimit)
            flush();
        va_end(h);
    }
    void puts(C const *const s)
    {
        if((sp+=strlen(strcpy(sp,s)))>=slimit)
            flush();
    }
    void putchar(II const x)
    {
        *sp++=(C)x;
        if(sp>=slimit)
            flush();
    }
}sysout;

#define N 1000100
using namespace std;
struct node
{
    int x,y;
}a[N<<1];
int t;
int n,m;
int b[1010][1010];
int main()
{
    t=scan.getSI();
    while(t--)
    {
        n=scan.getSI();
        m=scan.getSI();
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                int x;
                x=scan.getSI();
                x+=1000000;
                a[x].x=i,a[x].y=j;
            }
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                b[i][j]=scan.getSI();
            }
        }
        int flag=0;
        if(!flag)
        {
            for(int i=1;i<=n;i++)
            {
                for(int j=2;j<=m;j++)
                {
                    if(a[b[i][j]+1000000].x!=a[b[i][j-1]+1000000].x)
                    {flag=1;break;}
                }
                if(flag)break;
            }
        }
        if(flag){puts("NIE");continue;}
        for(int i=1;i<=m;i++)
        {
            for(int j=2;j<=n;j++)
            {
                if(a[b[j][i]+1000000].y!=a[b[j-1][i]+1000000].y)
                {flag=1;break;}
            }
            if(flag)break;
        }
        if(flag)puts("NIE");
        else puts("TAK");
    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-08 20:58:21

BZOJ 1142 [POI2009]Tab 模拟的相关文章

BZOJ 1142: [POI2009]Tab

1142: [POI2009]Tab Time Limit: 40 Sec  Memory Limit: 162 MBSubmit: 213  Solved: 80[Submit][Status][Discuss] Description 2个n*m矩阵,保证同一个矩阵中元素两两不同.问能否通过若干次交换两行或交换两列把第一个矩阵变成第二个. Input 第一行正整数 T (1≤T≤10) 表示数据组数. 每组数据包括:第一行n m (1≤n,m≤1000) 2个n行m列的整数矩阵,元素绝对值均

BZOJ 1142 POI2009 Tab Hash

题目大意:给定两个矩阵,保证矩阵内所有元素都不相同,求第一个矩阵通过交换行和列是否可以得到第二个矩阵 令每一行的哈希值为这一行的元素排序后的RK哈希值,将行按照哈希值排序 然后把每一列按顺序哈希一下,排个序取RK哈希作为整个矩阵的哈希值 判断两个矩阵的哈希值是否相等即可 由于矩阵中元素不重复所以可以保证第一步的哈希值不会出现重复 然后...我都写完了它告诉我是2B题???? 算了反正POI官网上能过就是了= = #include <cstdio> #include <cstring>

BZOJ 1115: [POI2009]石子游戏Kam

1115: [POI2009]石子游戏Kam Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 924  Solved: 574[Submit][Status][Discuss] Description 有N堆石子,除了第一堆外,每堆石子个数都不少于前一堆的石子个数.两人轮流操作每次操作可以从一堆石子中移走任意多石子,但是要保证操作后仍然满足初始时的条件谁没有石子可移时输掉游戏.问先手是否必胜. Input 第一行u表示数据组数.对于每组数据,第一行

bzoj 2741: 【FOTILE模拟赛】L 分塊+可持久化trie

2741: [FOTILE模拟赛]L Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 1116  Solved: 292[Submit][Status] Description FOTILE得到了一个长为N的序列A,为了拯救地球,他希望知道某些区间内的最大的连续XOR和. 即对于一个询问,你需要求出max(Ai xor Ai+1 xor Ai+2 ... xor Aj),其中l<=i<=j<=r. 为了体现在线操作,对于一个询问(x,y):

[BZOJ入门OJ2092][Noip模拟题]舞会

2092: [Noip模拟题]舞会 Time Limit: 20 Sec  Memory Limit: 256 MB Submit: 9  Solved: 5 [Submit][Status][Web Board] Description 学校举行舞会啦,一共有N个人参加,所有人站成一排,从左开始编号,最左边的人编号为1 ,最右边的为N.每个人跳舞的熟练度我们用一个整数表示,第i个人的熟练度为Ai,每次熟 练度最接近的一对相邻男女会出列跳舞,如果有多对那么最左边的那一对会先出列,请你给 出出列跳

BZOJ 1137: [POI2009]Wsp 岛屿 半平面交

1137: [POI2009]Wsp 岛屿 Time Limit: 10 Sec  Memory Limit: 162 MBSec  Special JudgeSubmit: 165  Solved: 78[Submit][Status][Discuss] Description Byteotia岛屿是一个凸多边形.城市全都在海岸上.按顺时针编号1到n.任意两个城市之间都有一条笔直的道路相连.道路相交处可以自由穿行.有一些道路被游击队控制了,不能走,但是可以经过这条道路与未被控制的道路的交点.问

bzoj 1138: [POI2009]Baj 最短回文路 dp优化

1138: [POI2009]Baj 最短回文路 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 161  Solved: 48[Submit][Status] Description N个点用M条有向边连接,每条边标有一个小写字母. 对于一个长度为D的顶点序列,回答每对相邻顶点Si到Si+1的最短回文路径. 如果没有,输出-1. 如果有,输出最短长度以及这个字符串. Input 第一行正整数N和M ( 2 ≤ N ≤ 400 , 1 ≤ M ≤

bzoj 1133: [POI2009]Kon dp

1133: [POI2009]Kon Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 242  Solved: 81[Submit][Status][Discuss] Description 火车沿途有N个车站,告诉你从每一站到每一站的人数,现在查票员只能查K次票,每次查票可以控制目前在车上的所有乘客的车票.求一个查票方案,使得控制的不同的乘客尽量多. (显然对同一个乘客查票多次是没有意义的,只算一次) Input 第一行正整数 N K (1≤K<

bzoj 1115: [POI2009]石子游戏Kam -- 博弈论

1115: [POI2009]石子游戏Kam Time Limit: 10 Sec  Memory Limit: 162 MB Description 有N堆石子,除了第一堆外,每堆石子个数都不少于前一堆的石子个数.两人轮流操作每次操作可以从一堆石子中移走任意多石子,但是要保证操作后仍然满足初始时的条件谁没有石子可移时输掉游戏.问先手是否必胜. Input 第一行u表示数据组数.对于每组数据,第一行N表示石子堆数,第二行N个数ai表示第i堆石子的个数(a1<=a2<=……<=an). 1