1. 程式人生 > 實用技巧 >資料很強的時候別用cin和cout

資料很強的時候別用cin和cout

這題就算演算法對了,我還是TLE十幾次.

#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;

int m, n, s[1000010], ct, tmp[1000010];

inline void merge(int l, int r) {
    if (l == r) return;
    int mid = l + r >> 1;
    merge(l, mid);
    merge(mid 
+ 1, r); int i = l, j = mid + 1; for (register int k = l; k <= r; k++) if (j > r || i <= mid && s[i] <= s[j]) tmp[k] = s[i++]; else tmp[k] = s[j++], ct += mid - i + 1; for (register int i = l; i <= r; i++) s[i] = tmp[i]; } int
main() { ios::sync_with_stdio(false); // 就算這樣也不行 cin.tie(0), cout.tie(0); while (cin >> m >> n) { if (!m && !n) return 0; ct = 0; int linex = 0, b; int k = 0; for (register int i = 1; i <= m; i++) for (register int j = 1
; j <= n; j++) { cin >> b; if (!b) linex = m - i; else s[++k] = b; } merge(1, k); if (n & 1) { if (ct & 1) puts("NO"); else puts("YES"); } else if ((linex ^ ct) & 1) puts("NO"); else puts("YES"); } return 0; }
TLE Code

#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;

int m, n, s[1000010], ct, tmp[1000010];

inline void merge(int l, int r) {
    if (l == r) return;
    int mid = l + r >> 1;
    merge(l, mid);
    merge(mid + 1, r);
    int i = l, j = mid + 1;
    for (register int k = l; k <= r; k++)
        if (j > r || i <= mid && s[i] <= s[j])
            tmp[k] = s[i++];
        else
            tmp[k] = s[j++], ct += mid - i + 1;
    for (register int i = l; i <= r; i++) s[i] = tmp[i];
}

int main() {
    while (scanf("%d%d", &m, &n)) {
        if (!m && !n) return 0;

        ct = 0;
        int linex = 0, b;
        int k = 0;
        for (register int i = 1; i <= m; i++)
            for (register int j = 1; j <= n; j++) {
                scanf("%d", &b);
                if (!b)
                    linex = m - i;
                else
                    s[++k] = b;
            }

        merge(1, k);

        if (n & 1) {
            if (ct & 1)
                puts("NO");
            else
                puts("YES");
        } else if ((linex ^ ct) & 1)
            puts("NO");
        else
            puts("YES");
    }

    return 0;
}
AC Code

十分頭疼.