bug运输[辽宁2014年省队互测一]
奇奇怪怪的题目,不知道他要我们干什么。
我们观察一波局势,发现答案最大不过5.因为如果答案是6或以上的话,我们就至少要2^(5*5)个5*5的方格。
仔细计算一波时间复杂度,再信仰一波,坚信暴力压正解。
#include<bits/stdc++.h> #define sight(c) ('0'<=c&&c<='9') #define N 1007 #define X(x) x<<=1,x|=a[j+ii][k+jj] #define Y(x) x<<=1,x|=a[j+jj][k+ii] #define MARICLE __attribute__((optimize("-O3"))) #define O(x) f[x]?(x=0):(f[x]=1,ans++,x=0); MARICLE inline void read(int &x){ static char c; for (c=getchar();!sight(c);c=getchar()); for (x=0;sight(c);c=getchar())x=x*10+c-48; } MARICLE inline void reads(bool &x){ static char c; for (c=getchar();!sight(c);c=getchar()); x=(int)c-48; } using namespace std; MARICLE void write(int x){if (x<10) {putchar('0'+x); return;} write(x/10); putchar('0'+x%10);} MARICLE inline void writeln(int x){ if (x<0) putchar('-'),x*=-1; write(x); putchar('\n'); } int n,ag,op,ans,ap,ot; bool a[N][N],k[2],f[(1<<25)+7]; MARICLE void writeLn(int x,int len){ for (int i=len-1;~i;i--) { for (int j=len-1;~j;j--) putchar('0'+(x>>i*len+j&1));putchar('\n');} } MARICLE int main () { // freopen("a.in","r",stdin); read(n); for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) reads(a[i][j]),k[a[i][j]]=1; if (!k[0]) {writeln(1);writeln(0);return 0;} if (!k[1]) {writeln(1);writeln(1);return 0;} for (int i=2;i<=5;i++) { memset(f,0,sizeof f);ans=0; for (int j=n-i+1;j;j--) for (int k=n-i+1;k;k--) { for (int ii=0;ii<i;ii++) for (int jj=0;jj<i;jj++) X(ag),Y(ap); O(ag);O(ap); for (int ii=i-1;~ii;ii--) for (int jj=0;jj<i;jj++) X(ag),Y(ap); O(ag);O(ap); for (int ii=0;ii<i;ii++) for (int jj=i-1;~jj;jj--) X(ag),Y(ap); O(ag);O(ap); for (int ii=i-1;~ii;ii--) for (int jj=i-1;~jj;jj--) X(ag),Y(ap); O(ag);O(ap); } if (ans^(1<<i*i)) { ot=1<<i*i; for (int g=0;g<ot;g++) if (!f[g]) { writeln(i),writeLn(g,i); return 0;} } } }