資料很強的時候別用cin和cout
阿新 • • 發佈:2020-12-21
這題就算演算法對了,我還是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(midTLE Code+ 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]; } intmain() { 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; }
#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
十分頭疼.