首先,先不管代码的正确性,有以下代码(理应正确):
#include <cstdio>
#include <cstdlib>
#include <set>
#define N 3000
using namespace std;
int n, siz;
bool a[N][N], v[N][N];
int tot;
inline int calc(int x) {
if(x < 0) return x + siz;
else if(x >= siz) return x - siz;
return x;
}
inline int read() {
int x = 0;
char c = '.';
while(c < '0' || c > '9') c = getchar();
while(c >= '0' && c <= '9') {
x = (x << 1) + (x << 3) + (c ^ '0');
c = getchar();
}
return x;
}
int main() {
// freopen("set.in", "r", stdin);
// freopen("set.out", "w", stdout);
n = read();
siz = 1<<n;
for(int i = 0; i < siz; i++) {
for(int j = 0; j < siz; j++) {
a[i][j] = read();
}
}
for(int w = siz/2; w >= 2; w /= 2) {
for(int i = 0; i < siz; i++) {
for(int j = 0; j < siz; j++) {
v[i][j] = 0;
}
}
for(int i = 0; i < siz; i++) {
for(int j = 0; j < siz; j++) {
if(a[i][j]) {
v[i][j] ^= 1;
v[calc(i+w/2)][j] ^= 1;
v[calc(i-w/2)][j] ^= 1;
v[i][calc(j+w/2)] ^= 1;
v[i][calc(j-w/2)] ^= 1;
}
}
}
for(int i = 0; i < siz; i++) {
for(int j = 0; j < siz; j++) {
a[i][j] = v[i][j];
}
}
}
for(int i = 0; i < siz; i++) {
for(int j = 0; j < siz; j++) {
if(v[i][j]) {
tot++;
}
}
}
printf("%d\n", tot);
for(int i = 0; i < siz; i++) {
for(int j = 0; j < siz; j++) {
if(v[i][j]) {
printf("%d %d\n", i, j);
}
}
}
}
其中的:
for(int i = 0; i < siz; i++) {
for(int j = 0; j < siz; j++) {
if(a[i][j]) {
v[i][j] ^= 1;
v[calc(i+w/2)][j] ^= 1;
v[calc(i-w/2)][j] ^= 1;
v[i][calc(j+w/2)] ^= 1;
v[i][calc(j-w/2)] ^= 1;
}
}
}
是导致tle的重要代码。
但是当我把它换成(当然,更换之后代码是不正确的,但是我们先不管正确性):
for(int i = 0; i < siz; i++) {
for(int j = 0; j < siz; j++) {
if(a[i][j]) {
a[i][j] ^= 1;
a[calc(i+w/2)][j] ^= 1;
a[calc(i-w/2)][j] ^= 1;
a[i][calc(j+w/2)] ^= 1;
a[i][calc(j-w/2)] ^= 1;
}
}
}
就不会tle(500ms)