Submission #72400773


Source Code Expand

/*
C++に変換

方針: 二分探索
1: Aをソートする
2: 各クエリに答える
  2-1: 区間[X,e]に含まれるAの要素数kとしたとき、count = (e-X+1)-k がYになる最小のeを求める
    *e-X+1: 区間[X,e]には数字がX,X+1,X+2,...,eのe-X+1個 存在する という意味
    *countは単調増加: なぜなら区間が1増えるごとにkは0または1のみ増えるので(countが減少することはない)
  2-2: 2-1の結果に応じて答えを求める
  
例:
A = [1,2,3,9,16]
  ・6以上15以下の場合:  (15-6+1) -1 = 9個  // k=1(9)
  ・6以上16以下の場合:  (16-6+1) -2 = 9個  // k=2(9,16)
  ・6以上17以下の場合:  (17-6+1) -2 = 10個 // k=2(9,16)
  -> Y=10なのでe=17が答え
*/
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

// 区間 [l, r] において data に含まれない整数が k 個以上あるか
bool check_range(const vector<ll>& data, ll l, ll r, ll k) {
    // Python の bisect_left / bisect_right に対応
    auto it_l = lower_bound(data.begin(), data.end(), l);
    auto it_r = upper_bound(data.begin(), data.end(), r);

    ll count_in_range = it_r - it_l;           // 区間 [l, r] に含まれる data の個数
    ll count = (r - l + 1) - count_in_range;   // 含まれない整数の個数

    return count >= k;
}

// 二分探索で条件を満たす最小の e を求める
ll calc_right_val(const vector<ll>& A, ll X, ll Y) {
    ll l = X - 1;
    ll r = 3LL * 1000000000 + 1; // 3 * 10^9 + 1

    while (r - l > 1) {
        ll mid = (l + r) / 2;
        if (check_range(A, X, mid, Y)) {
            r = mid;
        } else {
            l = mid;
        }
    }

    // l or r が答え
    if (check_range(A, X, l, Y)) {
        return l;
    } else {
        return r;
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int N, Q;
    cin >> N >> Q;

    vector<ll> A(N);
    for (int i = 0; i < N; i++) {
        cin >> A[i];
    }
    sort(A.begin(), A.end());

    while (Q--) {
        ll X, Y;
        cin >> X >> Y;
        cout << calc_right_val(A, X, Y) << '\n';
    }

    return 0;
}

Submission Info

Submission Time
Task D - Forbidden List 2
User hiro716
Language C++23 (GCC 15.2.0)
Score 400
Code Size 2227 Byte
Status AC
Exec Time 978 ms
Memory 5808 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 400 / 400
Status
AC × 2
AC × 22
Set Name Test Cases
Sample 00-sample-01.txt, 00-sample-02.txt
All 00-sample-01.txt, 00-sample-02.txt, 01-01.txt, 01-02.txt, 01-03.txt, 01-04.txt, 01-05.txt, 01-06.txt, 01-07.txt, 01-08.txt, 01-09.txt, 01-10.txt, 01-11.txt, 01-12.txt, 01-13.txt, 01-14.txt, 01-15.txt, 01-16.txt, 01-17.txt, 01-18.txt, 01-19.txt, 01-20.txt
Case Name Status Exec Time Memory
00-sample-01.txt AC 1 ms 3652 KiB
00-sample-02.txt AC 1 ms 3576 KiB
01-01.txt AC 4 ms 3656 KiB
01-02.txt AC 5 ms 3512 KiB
01-03.txt AC 5 ms 3504 KiB
01-04.txt AC 5 ms 3512 KiB
01-05.txt AC 7 ms 3680 KiB
01-06.txt AC 9 ms 3792 KiB
01-07.txt AC 5 ms 3792 KiB
01-08.txt AC 8 ms 3732 KiB
01-09.txt AC 8 ms 3648 KiB
01-10.txt AC 7 ms 3588 KiB
01-11.txt AC 7 ms 3732 KiB
01-12.txt AC 8 ms 3784 KiB
01-13.txt AC 590 ms 5780 KiB
01-14.txt AC 942 ms 5780 KiB
01-15.txt AC 978 ms 5784 KiB
01-16.txt AC 231 ms 4328 KiB
01-17.txt AC 883 ms 5808 KiB
01-18.txt AC 667 ms 5004 KiB
01-19.txt AC 446 ms 5792 KiB
01-20.txt AC 571 ms 5652 KiB