求问奇怪的 TLE
查看原帖
求问奇怪的 TLE
112917
Eason_AC楼主2021/9/6 19:28

RT,先放两个代码

首先是 TLE on 53 的:


namespace Solution {
    const int N = 1007;
    int n, m, k, a, b, c, mod, f[N][N];

    ii ksm(int a, int b) {
        int res = 1;
        for(; b; b >>= 1, a = 1ll * a * a % mod)
            if(b & 1) res = 1ll * res * a % mod;
        return res;
    }

	iv Main() {
        read(n, m, k);
        F(int, i, 1, k) {
            read(a, b, c);
            if(n < m) a ^= b ^= a ^= b;
            f[a][b] = c;
        }
        read(mod); if(n < m) n ^= m ^= n ^= m;
        if((n - m) & 1) return puts("0"), void();
        int cnt = (n - 1) * (m - 1) - k, fl = 0;
        F(int, i, 1, n) {
            int num = 0, t = 1; 
            F(int, j, 1, m) if(f[i][j]) num++, t *= f[i][j];
            if(num == m) {
                if(t != -1) {fl = 1; break;}
                cnt++;
            }
        }
        write((1 - fl) * ksm(2, cnt));
		return;
	}
}

然后是 AC 的:

namespace Solution {
    const int N = 1007;
    int n, m, k, a, b, c, mod, f[N][N];

    ii ksm(int a, int b) {
        int res = 1;
        for(; b; b >>= 1, a = 1ll * a * a % mod)
            if(b & 1) res = 1ll * res * a % mod;
        return res;
    }

	iv Main() {
        read(n, m, k);
        F(int, i, 1, k) {
            read(a, b, c);
            if(n < m) a ^= b ^= a ^= b;
            f[a][b] = c;
        }
        read(mod); if(n < m) n ^= m ^= n ^= m;
        if((n - m) & 1) return puts("0"), void();
        int cnt = (n - 1) * (m - 1) - k, fl = 0;
        F(int, i, 1, n) {
            int num = 0, t = 1; 
            F(int, j, 1, m) if(f[i][j]) num++, t *= f[i][j];
            if(num == m) {
                if(t != -1) {fl = 1; break;}
                cnt++;
            }
        }
        if(fl) write(0);
        else write(ksm(2, cnt));
		return;
	}
}

以下是上面代码中都涉及到的 read()write() 函数:

#define Tl template<typename T>
#define Tla template<typename T, typename... args>

Tl iv read(T &x) {T f = 1; x = 0; char c = getchar(); while(!isdigit(c)) {if(c == '-') f = -1; c = getchar();} while(isdigit(c)) {x = x * 10 + c - '0'; c = getchar();} x *= f;}
Tla iv read(T& x, args &...Args) {read(x), read(Args...);}
Tl iv write(T x) {if(x < 0) {putchar('-'); x = -x;} if(x > 9) write(x / 10); putchar(x % 10 + '0');}

可以看到,两个代码的不同的地方仅在于最后输出答案的这一段,之前的代码由于我图省事,就直接输出 (1 - fl) * ksm(2, cnt) 了,但是这会导致 TLE on 53。而老老实实地判 if-else 分别输出却不会出这个锅。

由于是自己无意间改了下这里交上去过的,并不清楚其中的奥妙,因此有哪位过路神仙解释一下这个东西为什么这么改就过了,以防我下次再踩进这个坑里面

2021/9/6 19:28
加载中...