自学内容网 自学内容网

Codeforces Round #956 (Div. 2) and ByteRace 2024

A题:Array Divisibility

思路:

大水题

code:

inline void solve() {
     int n; cin >> n;
     for (int i = 1; i <= n; i ++ ) {
     cout << i << " \n"[i == n];
     }
 return;
}

B题:Corner Twist 

思路:

模拟

任意一个矩形的修改,都可以下放到最小的2x2的小矩形,因此,我们只需在要修改的地方用2x2的小矩形修改即可。

code:

inline void solve() {
     int n, m; cin >> n >> m;
     vector<vector<int>> a(n + 1, vector<int>(m + 1)), b(n + 1, vector<int>(m + 1));
     for (int i = 1; i <= n; i ++ ) {
     for (int j = 1; j <= m; j ++ ) {
     char c; cin >> c;
     a[i][j] = c - '0';
     }
     }
     for (int i = 1; i <= n; i ++ ) {
     for (int j = 1; j <= m; j ++ ) {
     char c; cin >> c;
     b[i][j] = c - '0';
     }
     }
     function<void(int&, int)> add = [&](int &x, int c) {
     x = (x + c) % 3;
     };
     for (int i = 1; i <= n - 1; i ++ ) {
     for (int j = 1; j <= m - 1; j ++ ) {
     if (a[i][j] == b[i][j]) continue;
     int d = (b[i][j] - a[i][j] + 3) % 3;
     add(a[i][j], d), add(a[i + 1][j + 1], d);
     add(a[i + 1][j], 3 - d), add(a[i][j + 1], 3 - d);
     }
     }
     if (a == b) cout << "YES\n";
     else cout << "NO\n";
 return;
}

C题:Have Your Cake and Eat It Too 

思路:

贪心+二分,只是情况变多了而已。

code:

inline void solve() {
     int n; cin >> n;
     vector<vector<ll>> a(3, vector<ll>(n + 1));
     for (int i = 0; i < 3; i ++ ) {
     for (int j = 1; j <= n; j ++ ) {
     cin >> a[i][j];
     a[i][j] += a[i][j - 1];
     }
     }
     ll nd = (a[0][n] + 2) / 3;
     int cur[3] = {0, 1, 2};
     bool ok = false;
     function<bool(vector<ll>, vector<ll>, vector<ll>)> check = [&](vector<ll> a, vector<ll> b, vector<ll> c) {
     int l[3], r[3];
     l[0] = 0, r[0] = n + 1;
     while (l[0] + 1 != r[0]) {
     int mid = l[0] + r[0] >> 1;
     if (a[mid] < nd) l[0] = mid;
     else r[0] = mid;
     }
     l[0] = 1;
     if (r[0] >= n - 1) return false;
     l[1] = r[0], r[1] = n + 1;
     while (l[1] + 1 != r[1]) {
     int mid = l[1] + r[1] >> 1;
     if (b[mid] - b[r[0]] < nd) l[1] = mid;
     else r[1] = mid;
     }
     l[1] = r[0] + 1;
     if (r[1] >= n) return false;
     l[2] = r[1], r[2] = n + 1;
     while (l[2] + 1 != r[2]) {
     int mid = l[2] + r[2] >> 1;
     if (c[mid] - c[r[1]] < nd) l[2] = mid;
     else r[2] = mid;
     }
     l[2] = r[1] + 1;
     if (r[2] == n + 1) return false;
     r[2] = n;
     ok = true;
     for (int i = 0; i < 3; i ++ ) {
     for (int j = 0; j < 3; j ++ ) {
     if (cur[j] == i) {
     cout << l[j] << ' ' << r[j] << ' ';
     }
     }
     }
     cout << endl;
     return true;
     };
     do {
     if (check(a[cur[0]], a[cur[1]], a[cur[2]])) break;
     }while (next_permutation(cur, cur + 3));
     if (!ok) cout << -1 << endl;
 return;
}


原文地址:https://blog.csdn.net/2301_80105412/article/details/140262572

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!