Codeforces Round 887 (Div. 2)

C. Ntarsis' Set

image-20230724121346402

(\(1 \leq n,k \leq 2 \cdot 10^5\))

题解:思维 + 二分

  • 我们不妨反向考虑
  • 由于答案最后一次一定在第一个位置
  • 所以答案上一轮一定在第一个空的位置,假设这个位置为\(x\)
  • 那么如果说要使得答案在位置\(x\),那么上上一轮答案一定在第\(x\)个空的位置
  • 我们可以预处理空位置数量的前缀和
  • 然后枚举\(k\)即可,每次枚举二分找到空位置
const int N = 2e5 + 10, M = 4e5 + 10;

int n, k;
int a[N];
int pre[N];

void solve()
{
    cin >> n >> k;
    for (int i = 1; i <= n; ++i)
    {
        cin >> a[i];
        pre[i] = pre[i - 1] + a[i] - a[i - 1] - 1;
    }

    if (a[1] > 1)
    {
        cout << 1 << endl;
        return;
    }
    int ans = 1;
    for (int i = 1; i <= k; ++i)
    {
        int p = lower_bound(pre + 1, pre + n + 1, ans) - pre;
        ans = a[p - 1] + (ans - pre[p - 1]);
    }
    cout << ans << endl;
}
posted @ 2023-07-24 12:19  Zeoy_kkk  阅读(70)  评论(0编辑  收藏  举报