Codeforces Round #737 (Div. 2)(补题)

Posted 佐鼬Jun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #737 (Div. 2)(补题)相关的知识,希望对你有一定的参考价值。

B. Moamen and k-subarrays



题意: 长度为n的一个数组,让你划分几个子数组,子数组之间可以随意相互交换顺序,问你能否恰好划分k个子数组,使得数组按照非严格递减来排序
思路: 可以按照他们的值进行排序并根据他们排完序后的顺序付一个rank,再还原数组,若两个数之间的rank是连续的,说明可以放在一个子数组中。
也可以二分来做,直接对每个数二分找比他大的数是否是你当前数的下一个数,如果是,说明这两个数是连续的,不是就要归为两个不同的子数组。
也可以记录每个数的前驱来做,和上面原理一样
注意:计数器cnt一定要从1开始,最少1个子数组(一开始没注意,一直wa3)

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int a[N], b[N];
int n, k;
int main() {
    int t;
    scanf("%d", &t);
    while (t--) {
        memset(b, 0, sizeof(b));
        memset(a, 0, sizeof(a));
        scanf("%d%d", &n, &k);
        for (int i = 0; i < n; i++) {
            scanf("%d", &a[i]);
            b[i] = a[i];
        }
        sort(b, b + n);
        int cnt = 1;
        for (int i = 1; i < n; i++) {
            if (a[i] < a[i - 1]) {
                cnt++;
            } else {
                if (a[i] == a[i - 1]) continue;
                if (a[i] > a[i - 1]) {
                    int t = upper_bound(b, b + n, a[i - 1]) - b;
                    if (b[t] == a[i])
                        continue;
                    else
                        cnt++;
                }
            }
        }
        if (cnt > k)
            puts("No");
        else
            puts("Yes");
    }
    return 0;
}

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
struct node {
    int id;
    int x;
    int rank;
} a[N];
bool cmp1(node a, node b) { return a.x < b.x; }
bool cmp2(node a, node b) { return a.id < b.id; }
int main() {
    int t;
    scanf("%d", &t);
    while (t--) {
        int n, k;
        memset(a, 0, sizeof(a));
        scanf("%d%d", &n, &k);
        for (int i = 0; i < n; i++) {
            scanf("%d", &a[i].x);
            a[i].id = i;
        }
        sort(a, a + n, cmp1);
        int cnt = 1;
        for (int i = 0; i < n; i++) {
            a[i].rank = i;
        }
        sort(a, a + n, cmp2);
        for (int i = 1; i < n; i++) {
            if (a[i].rank - 1 != a[i - 1].rank) {
                cnt++;
            }
        }
        if (cnt <= k)
            puts("Yes");
        else
            puts("No");
    }
    return 0;
}

To be continued
如果你有任何建议或者批评和补充,请留言指出,不胜感激

以上是关于Codeforces Round #737 (Div. 2)(补题)的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #737 (Div. 2) 题解

Codeforces Round #737 (Div. 2) 题解

Codeforces Round #737 (Div. 2) 题解

Codeforces Round #737 (Div. 2) Ezzat and Grid(线段树优化dp)

Codeforces Round #737 (Div. 2)(补题)

Codeforces Round #737 (Div. 2) C