結果
| 問題 |
No.2627 Unnatural Pitch
|
| コンテスト | |
| ユーザー |
AngrySadEight
|
| 提出日時 | 2024-01-02 01:33:36 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 922 ms / 4,000 ms |
| コード長 | 1,761 bytes |
| コンパイル時間 | 1,214 ms |
| コンパイル使用メモリ | 84,424 KB |
| 最終ジャッジ日時 | 2025-02-18 15:49:30 |
|
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 23 |
ソースコード
#include <iostream>
#include <map>
#include <vector>
using namespace std;
using ll = long long;
int main(){
ll N, K, L, U;
cin >> N >> K >> L >> U;
vector<ll> A(N);
for (ll i = 0; i < N; i++) {
cin >> A[i];
}
ll diffs = U - L;
// 「L より小さいものの個数」 <= 「U より大きいものの個数」
ll ok = 0;
ll ng = 1000000000002;
while (ng - ok > 1) {
ll mid = (ok + ng) / 2;
ll lower = 0;
ll upper = 0;
for (ll i = 0; i < N; i++) {
if (A[i] < mid) {
lower++;
}
if (A[i] > mid + diffs) {
upper++;
}
}
if (lower <= upper) {
ok = mid;
} else {
ng = mid;
}
}
map<ll, ll> mp;
for (ll i = 0; i < N; i++) {
mp[A[i]]++;
}
ll ans = 1000000000000000002;
ll now_score = 0;
ll now_L = ok - K;
ll now_U = now_L + diffs;
map<ll, ll> left_rem; // 左側の値の余り
map<ll, ll> right_rem; // 右側の値の余り
for (ll i = 0; i < N; i++) {
if (A[i] < now_L) {
now_score += ((now_L - A[i] + K - 1) / K);
left_rem[A[i] % K]++;
}
if (A[i] > now_U) {
now_score += ((A[i] - now_U + K - 1) / K);
right_rem[A[i] % K]++;
}
}
ans = min(ans, now_score);
for (ll i = 0; i < 2 * K; i++) {
left_rem[(now_L % K + K) % K] += mp[now_L];
now_score += left_rem[(now_L % K + K) % K];
now_L++;
now_U++;
now_score -= right_rem[(now_U % K + K) % K];
right_rem[(now_U % K + K) % K] -= mp[now_U];
ans = min(ans, now_score);
}
cout << ans << endl;
}
AngrySadEight