网上找不到满分的题解,百度谷歌找了个遍,无奈之下,只好贴上本人的代码(25分)
纯暴力解法(不知道能用到什么算法?)
#includeusing namespace std; struct disk { int pre_id = 0, new_id = 0; int num = 0; }disks[10001]; int main() { int n, m, k, p; cin >> n >> m >> k; for (int i = 0; i < k; i++) { int op, id, l, r, x; bool flag = true; int right = 0;//写入成功的最右位置 cin >> op; switch (op) { case 0: cin >> id >> l >> r >> x; for (int j = l; j <= r; j++) { if (disks[j].new_id == 0 || disks[j].new_id == id) { disks[j].new_id = id; disks[j].num = x; flag = false; } else { right = j - 1; break; } } if (flag) cout << -1 << endl; else if (right != 0) cout << right << endl; else cout << r << endl; break; case 1: cin >> id >> l >> r; for (int j = l; j <= r; j++) { if (disks[j].new_id != id) { flag = false; break; } } if (flag) { for (int j = l; j <= r; j++) { disks[j].pre_id = disks[j].new_id; disks[j].new_id = 0; } cout << "OK" << endl; } else cout << "FAIL" << endl; break; case 2: cin >> id >> l >> r; for (int j = l; j <= r; j++) { if (disks[j].new_id != 0 || disks[j].pre_id != id) { flag = false; break; } } if (flag) { for (int j = l; j <= r; j++) { disks[j].new_id = id; disks[j].pre_id = 0; } cout << "OK" << endl; } else cout << "FAIL" << endl; break; case 3: cin >> p; if (disks[p].new_id == 0) cout << 0 << " " << 0 << endl; else cout << disks[p].new_id << " " << disks[p].num << endl; break; default: break; } } return 0; }



