Yuulis.log

トンネルを抜けるとそこは参照エラーであった。

【AtCoder】ABC 346 C - Σ | 茶コーダーが解くAtCoder

atcoder.jp

実行時間制限: 2 sec / メモリ制限: 1024 MB / Difficulty: 179

問題概要

長さ  N の正整数列  A = \{A_1, A_2, ..., A_N\} と正整数  K が与えられる。  1 以上  K 以下の正整数のうち、  A の中に一度も現れないものの総和を求めよ。

制約

  • 入力はすべて整数
  •  1 \leq N \leq 2 \times 10^5
  •  1 \leq K, A_i \leq 2 \times 10^9

考察

 1 \leq K \leq 2 \times 10^9 なので、  1 から  K までの数について各々が  A に含まれるかどうかを判定していくのは厳しい。

そこで、 A の要素数  N が比較的小さいことに注目して、  1 から  K までの数の総和から  A に1回以上現れる  1 以上  K 以下の要素を引けばよい。このとき、  A には要素の重複があり得るので、setmapを使って要素の種類だけを考えなければらない。

ここではsetの方がより適切か。

コード

#include <bits/stdc++.h>
using namespace std;

#define rep(i, start, end) for (ll i = (start); i < (ll)(end); i++)

// ======================================== //

int main()
{
   ll N, K;
    cin >> N >> K;
    map<ll, ll> mp;
    rep(i, 0, N)
    {
        ll A;
        cin >> A;
        mp[A]++;
    }

    ll sum = K * (K + 1) / 2;
    for (auto &&m : mp)
    {
        if (m.first > K)
            break;

        sum -= m.first;
    }

    cout << sum << endl;
}

atcoder.jp

実装時間: 10分