当前位置:   article > 正文

Codeforces Round 956 (Div. 2) 部分题解A~C_codeforces 956

codeforces 956

A. Array Divisibility

题目大意

构造长度为n的数组,满足:

  • 所有j的aj之和可以被k整除,其中j是k的倍数,k的取值为1~n。

思路

构造序列1->n即可满足条件。

代码实现
  1. void solve() {
  2.    ll n; cin >> n;
  3.    for (int i = 1; i <= n; i++)cout << i << " ";
  4.    cout << "\n";
  5. }

B. Corner Twist

题目大意

给定a和b两个网格,网格中只存在0、1、2三种值。

给定操作,可以选择一个矩形的一条对角线上的两个端点,让他们加1/2;另一条对角线的端点值加2/1,然后对这些值取模3。问是否存在操作可以让a和b两个网格一致。

思路

考虑网格的边上的值,边上的值的变化会受到其他的影响,所以我们优先去找如何让边上的值相等即可。

正扫一遍,反扫一遍,然后比较数组即可。

代码实现
  1. void solve() {
  2.    ll n, m; cin >> n >> m;
  3.    vector<vector<char>>a(n + 1, vector<char>(m + 1));
  4.    vector<vector<char>>b(n + 1, vector<char>(m + 1));
  5.    for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++)cin >> a[i][j];
  6.    for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++)cin >> b[i][j];
  7.    for (int i = 1; i < n; i++) {
  8.        for (int j = 1; j < m; j++) {
  9.            if (a[i][j] != b[i][j]) {
  10.                if (a[i][j] == '0') {
  11.                    if (b[i][j] == '1') {
  12.                        a[i][j] += 1;
  13.                        if (a[i][j] == '3')a[i][j] = '0';
  14.                        if (a[i][j] == '4')a[i][j] = '1';
  15.                        a[i + 1][j + 1] += 1;
  16.                        if (a[i + 1][j + 1] == '3')a[i + 1][j + 1] = '0';
  17.                        if (a[i + 1][j + 1] == '4')a[i + 1][j + 1] = '1';
  18.                        a[i + 1][j] += 2;
  19.                        if (a[i + 1][j] == '3')a[i + 1][j] = '0';
  20.                        if (a[i + 1][j] == '4')a[i + 1][j] = '1';
  21.                        a[i][j + 1] += 2;
  22.                        if (a[i][j + 1] == '3')a[i][j + 1] = '0';
  23.                        if (a[i][j + 1] == '4')a[i][j + 1] = '1';
  24.                   }else if(b[i][j]=='2') {
  25.                        a[i][j] += 2;
  26.                        if (a[i][j] == '3')a[i][j] = '0';
  27.                        if (a[i][j] == '4')a[i][j] = '1';
  28.                        a[i + 1][j + 1] += 2;
  29.                        if (a[i + 1][j + 1] == '3')a[i + 1][j + 1] = '0';
  30.                        if (a[i + 1][j + 1] == '4')a[i + 1][j + 1] = '1';
  31.                        a[i + 1][j] += 1;
  32.                        if (a[i + 1][j] == '3')a[i + 1][j] = '0';
  33.                        if (a[i + 1][j] == '4')a[i + 1][j] = '1';
  34.                        a[i][j + 1] += 1;
  35.                        if (a[i][j + 1] == '3')a[i][j + 1] = '0';
  36.                        if (a[i][j + 1] == '4')a[i][j + 1] = '1';
  37.                   }
  38.               }
  39.                else if (a[i][j] == '1') {
  40.                    if (b[i][j] == '2') {
  41.                        a[i][j] += 1;
  42.                        if (a[i][j] == '3')a[i][j] = '0';
  43.                        if (a[i][j] == '4')a[i][j] = '1';
  44.                        a[i + 1][j + 1] += 1;
  45.                        if (a[i + 1][j + 1] == '3')a[i + 1][j + 1] = '0';
  46.                        if (a[i + 1][j + 1] == '4')a[i + 1][j + 1] = '1';
  47.                        a[i + 1][j] += 2;
  48.                        if (a[i + 1][j] == '3')a[i + 1][j] = '0';
  49.                        if (a[i + 1][j] == '4')a[i + 1][j] = '1';
  50.                        a[i][j + 1] += 2;
  51.                        if (a[i][j + 1] == '3')a[i][j + 1] = '0';
  52.                        if (a[i][j + 1] == '4')a[i][j + 1] = '1';
  53.                   }
  54.                    else if (b[i][j] == '0') {
  55.                        a[i][j] += 2;
  56.                        if (a[i][j] == '3')a[i][j] = '0';
  57.                        if (a[i][j] == '4')a[i][j] = '1';
  58.                        a[i + 1][j + 1] += 2;
  59.                        if (a[i + 1][j + 1] == '3')a[i + 1][j + 1] = '0';
  60.                        if (a[i + 1][j + 1] == '4')a[i + 1][j + 1] = '1';
  61.                        a[i + 1][j] += 1;
  62.                        if (a[i + 1][j] == '3')a[i + 1][j] = '0';
  63.                        if (a[i + 1][j] == '4')a[i + 1][j] = '1';
  64.                        a[i][j + 1] += 1;
  65.                        if (a[i][j + 1] == '3')a[i][j + 1] = '0';
  66.                        if (a[i][j + 1] == '4')a[i][j + 1] = '1';
  67.                   }
  68.               }
  69.                else {
  70.                    if (b[i][j] == '0') {
  71.                        a[i][j] += 1;
  72.                        if (a[i][j] == '3')a[i][j] = '0';
  73.                        if (a[i][j] == '4')a[i][j] = '1';
  74.                        a[i + 1][j + 1] += 1;
  75.                        if (a[i + 1][j + 1] == '3')a[i + 1][j + 1] = '0';
  76.                        if (a[i + 1][j + 1] == '4')a[i + 1][j + 1] = '1';
  77.                        a[i + 1][j] += 2;
  78.                        if (a[i + 1][j] == '3')a[i + 1][j] = '0';
  79.                        if (a[i + 1][j] == '4')a[i + 1][j] = '1';
  80.                        a[i][j + 1] += 2;
  81.                        if (a[i][j + 1] == '3')a[i][j + 1] = '0';
  82.                        if (a[i][j + 1] == '4')a[i][j+1] = '1';
  83.                   }
  84.                    else if (b[i][j] == '1') {
  85.                        a[i][j] += 2;
  86.                        if (a[i][j] == '3')a[i][j] = '0';
  87.                        if (a[i][j] == '4')a[i][j] = '1';
  88.                        a[i + 1][j + 1] += 2;
  89.                        if (a[i + 1][j + 1] == '3')a[i + 1][j + 1] = '0';
  90.                        if (a[i + 1][j + 1] == '4')a[i + 1][j + 1] = '1';
  91.                        a[i + 1][j] += 1;
  92.                        if (a[i + 1][j] == '3')a[i + 1][j] = '0';
  93.                        if (a[i + 1][j] == '4')a[i + 1][j] = '1';
  94.                        a[i][j + 1] += 1;
  95.                        if (a[i][j + 1] == '3')a[i][j + 1] = '0';
  96.                        if (a[i][j + 1] == '4')a[i][j + 1] = '1';
  97.                   }
  98.               }
  99.           }
  100.       }
  101.   }
  102.    for (int i = n; i > 1; i--) {
  103.        for (int j = m; j > 1; j--) {
  104.            if (a[i][j] != b[i][j]) {
  105.                if (a[i][j] == '0') {
  106.                    if (b[i][j] == '1') {
  107.                        a[i][j] += 1;
  108.                        if (a[i][j] == '3')a[i][j] = '0';
  109.                        if (a[i][j] == '4')a[i][j] = '1';
  110.                        a[i - 1][j - 1] += 1;
  111.                        if (a[i - 1][j - 1] == '3')a[i - 1][j - 1] = '0';
  112.                        if (a[i - 1][j - 1] == '4')a[i - 1][j - 1] = '1';
  113.                        a[i - 1][j] += 2;
  114.                        if (a[i - 1][j] == '3')a[i - 1][j] = '0';
  115.                        if (a[i - 1][j] == '4')a[i - 1][j] = '1';
  116.                        a[i][j - 1] += 2;
  117.                        if (a[i][j - 1] == '3')a[i][j - 1] = '0';
  118.                        if (a[i][j - 1] == '4')a[i][j - 1] = '1';
  119.                   }
  120.                    else if (b[i][j] == '2') {
  121.                        a[i][j] += 2;
  122.                        if (a[i][j] == '3')a[i][j] = '0';
  123.                        if (a[i][j] == '4')a[i][j] = '1';
  124.                        a[i - 1][j - 1] += 2;
  125.                        if (a[i - 1][j - 1] == '3')a[i - 1][j - 1] = '0';
  126.                        if (a[i - 1][j - 1] == '4')a[i - 1][j -1] = '1';
  127.                        a[i - 1][j] += 1;
  128.                        if (a[i - 1][j] == '3')a[i - 1][j] = '0';
  129.                        if (a[i - 1][j] == '4')a[i - 1][j] = '1';
  130.                        a[i][j - 1] += 1;
  131.                        if (a[i][j - 1] == '3')a[i][j - 1] = '0';
  132.                        if (a[i][j - 1] == '4')a[i][j - 1] = '1';
  133.                   }
  134.               }
  135.                else if (a[i][j] == '1') {
  136.                    if (b[i][j] == '2') {
  137.                        a[i][j] += 1;
  138.                        if (a[i][j] == '3')a[i][j] = '0';
  139.                        if (a[i][j] == '4')a[i][j] = '1';
  140.                        a[i - 1][j - 1] += 1;
  141.                        if (a[i - 1][j - 1] == '3')a[i - 1][j - 1] = '0';
  142.                        if (a[i - 1][j - 1] == '4')a[i - 1][j - 1] = '1';
  143.                        a[i - 1][j] += 2;
  144.                        if (a[i - 1][j] == '3')a[i - 1][j] = '0';
  145.                        if (a[i - 1][j] == '4')a[i - 1][j] = '1';
  146.                        a[i][j - 1] += 2;
  147.                        if (a[i][j - 1] == '3')a[i - 1][j] = '0';
  148.                        if (a[i][j - 1] == '4')a[i - 1][j] = '1';
  149.                   }
  150.                    else if (b[i][j] == '0') {
  151.                        a[i][j] += 2;
  152.                        if (a[i][j] == '3')a[i][j] = '0';
  153.                        if (a[i][j] == '4')a[i][j] = '1';
  154.                        a[i - 1][j - 1] += 2;
  155.                        if (a[i - 1][j - 1] == '3')a[i - 1][j - 1] = '0';
  156.                        if (a[i - 1][j - 1] == '4')a[i - 1][j - 1] = '1';
  157.                        a[i - 1][j] += 1;
  158.                        if (a[i - 1][j] == '3')a[i - 1][j] = '0';
  159.                        if (a[i - 1][j] == '4')a[i - 1][j] = '1';
  160.                        a[i][j - 1] += 1;
  161.                        if (a[i][j - 1] == '3')a[i][j - 1] = '0';
  162.                        if (a[i][j - 1] == '4')a[i][j - 1] = '1';
  163.                   }
  164.               }
  165.                else {
  166.                    if (b[i][j] == '0') {
  167.                        a[i][j] += 1;
  168.                        if (a[i][j] == '3')a[i][j] = '0';
  169.                        if (a[i][j] == '4')a[i][j] = '1';
  170.                        a[i - 1][j - 1] += 1;
  171.                        if (a[i - 1][j - 1] == '3')a[i - 1][j - 1] = '0';
  172.                        if (a[i - 1][j - 1] == '4')a[i - 1][j - 1] = '1';
  173.                        a[i - 1][j] += 2;
  174.                        if (a[i - 1][j] == '3')a[i - 1][j] = '0';
  175.                        if (a[i - 1][j] == '4')a[i - 1][j] = '1';
  176.                        a[i][j - 1] += 2;
  177.                        if (a[i][j - 1] == '3')a[i][j - 1] = '0';
  178.                        if (a[i][j - 1] == '4')a[i][j-1] = '1';
  179.                   }
  180.                    else if (b[i][j] == '1') {
  181.                        a[i][j] += 2;
  182.                        if (a[i][j] == '3')a[i][j] = '0';
  183.                        if (a[i][j] == '4')a[i][j] = '1';
  184.                        a[i - 1][j - 1] += 2;
  185.                        if (a[i - 1][j - 1] == '3')a[i - 1][j - 1] = '0';
  186.                        if (a[i - 1][j - 1] == '4')a[i - 1][j-1] = '1';
  187.                        a[i - 1][j] += 1;
  188.                        if (a[i - 1][j] == '3')a[i - 1][j] = '0';
  189.                        if (a[i - 1][j] == '4')a[i - 1][j] = '1';
  190.                        a[i][j - 1] += 1;
  191.                        if (a[i][j - 1] == '3')a[i][j - 1] = '0';
  192.                        if (a[i][j - 1] == '4')a[i][j-1] = '1';
  193.                   }
  194.               }
  195.           }
  196.       }
  197.   }
  198.    for (int i = 1; i <= n; i++) {
  199.        for (int j = 1; j <= m; j++) {
  200.            if (a[i][j] != b[i][j]) {
  201.                cout << "NO\n"; return;
  202.           }
  203.       }
  204.   }
  205.    cout << "YES\n";
  206. }

C. Have Your Cake and Eat It Too

题目大意

三个人吃蛋糕,每个人对蛋糕不同位置有自己的估价。

问如何分配蛋糕,使三个人获得的蛋糕价值均高于蛋糕价值和的三分之一。

思路

分类讨论:三个人拿蛋糕的顺序

  • abc

  • acb

  • bac

  • bca

  • cab

  • cba

代码实现
  1. ll a[2100000];
  2. ll b[2100000];
  3. ll c[2100000];
  4. void solve() {
  5.    ll n; cin >> n;
  6.    ll need = 0;
  7.    a[0] = b[0] = c[0] = 0;
  8.    for (int i = 1; i <= n; i++)cin >> a[i], need += a[i];
  9.    for (int i = 1; i <= n; i++)cin >> b[i];
  10.    for (int i = 1; i <= n; i++)cin >> c[i];
  11.    need = ceil(need / 3.0);
  12.    for (int i = 1; i <= n; i++)a[i] += a[i - 1];
  13.    for (int i = 1; i <= n; i++)b[i] += b[i - 1];
  14.    for (int i = 1; i <= n; i++)c[i] += c[i - 1];
  15.    a[n + 1] = b[n + 1] = c[n + 1] = 1e22;
  16.    //abc
  17.    ll id = lower_bound(a + 1, a + 1 + n, need) - a;
  18.    ll id2 = lower_bound(b + 1, b + 1 + n, b[id] + need) - b;
  19.    if (c[n] - c[id2] >= need) {
  20.        cout << 1 << " " << id << " " << id + 1 << " " << id2 << " " << id2 + 1 << " " << n << "\n";
  21.        return;
  22.   }
  23.    //acb
  24.    id = lower_bound(a + 1, a + 1 + n, need) - a;
  25.    id2 = lower_bound(c + 1, c + 1 + n, c[id] + need) - c;
  26.    if (b[n] - b[id2] >= need) {
  27.        cout << 1 << " " << id << " " << id2 + 1 << " " << n << " " << id + 1 << " " << id2 << "\n";
  28.        return;
  29.   }
  30.    //bca
  31.    id = lower_bound(b + 1, b + 1 + n, need) - b;
  32.    id2 = lower_bound(c + 1, c + 1 + n, c[id] + need) - c;
  33.    if (a[n] - a[id2] >= need) {
  34.        cout << id2 + 1 << " " << n << " " << 1 << " " << id << " " << id + 1 << " " << id2 << "\n";
  35.        return;
  36.   }
  37.    //bac
  38.    id = lower_bound(b + 1, b + 1 + n, need) - b;
  39.    id2 = lower_bound(a + 1, a + 1 + n, a[id] + need) - a;
  40.    if (c[n] - c[id2] >= need) {
  41.        cout << id + 1 << " " << id2 << " " << 1 << " " << id << " " << id2 + 1 << " " << n << "\n";
  42.        return;
  43.   }
  44.    //cab
  45.    id = lower_bound(c + 1, c + 1 + n, need) - c;
  46.    id2 = lower_bound(a + 1, a + 1 + n, a[id] + need) - a;
  47.    if (b[n] - b[id2] >= need) {
  48.        cout << id + 1 << " " << id2 << " " << id2 + 1 << " " << n <<" " << 1 << " " << id << "\n";
  49.        return;
  50.   }
  51.    //cba
  52.    id = lower_bound(c + 1, c + 1 + n, need) - c;
  53.    id2 = lower_bound(b + 1, b + 1 + n, b[id] + need) - b;
  54.    if (a[n] - a[id2] >= need) {
  55.        cout << id2 + 1 << " " << n << " " << id + 1 << " " << id2 << " " << 1 << " " << id << "\n";
  56.        return;
  57.   }
  58.    cout << "-1\n";
  59. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/1003909
推荐阅读
相关标签
  

闽ICP备14008679号