結果

問題 No.596 郵便配達
ユーザー Daniel Lu
提出日時 2025-05-16 23:07:46
言語 C++17
(gcc 13.3.0 + boost 1.87.0)
結果
WA  
実行時間 -
コード長 1,516 bytes
コンパイル時間 2,334 ms
コンパイル使用メモリ 192,380 KB
実行使用メモリ 7,844 KB
最終ジャッジ日時 2025-05-16 23:07:52
合計ジャッジ時間 5,592 ms
ジャッジサーバーID
(参考情報)
judge2 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 15 WA * 8
権限があれば一括ダウンロードができます

ソースコード

diff #

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

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

    long long N;          // 坐标上界(题目给出但实际不需要)
    int M;                // 邮筒数量
    if (!(cin >> N >> M)) return 0;

    const long long INF = (1LL << 60);

    long long L = INF, R = -INF;          // 整体左右端点
    long long maxLeft  = -INF;            // 有向左投递需求的邮筒中最右的坐标
    long long minRight =  INF;            // 有向右投递需求的邮筒中最左的坐标
    bool hasLeft = false, hasRight = false;

    for (int i = 0; i < M; ++i) {
        long long p; int k;
        cin >> p >> k;

        bool leftFlag = false, rightFlag = false;
        for (int j = 0; j < k; ++j) {
            long long d; cin >> d;
            L = min(L, min(p, d));
            R = max(R, max(p, d));

            if (d < p) leftFlag  = true;
            if (d > p) rightFlag = true;
        }
        if (leftFlag)  { hasLeft  = true; maxLeft  = max(maxLeft,  p); }
        if (rightFlag) { hasRight = true; minRight = min(minRight, p); }
    }

    long long answer;
    if (!hasLeft || !hasRight) {
        // 只需要单向扫描
        answer = R - L;
    } else {
        long long vShape = (R - L) + (maxLeft  - L);   // 先左后右
        long long aShape = (R - L) + (R - minRight);   // 先右后左
        answer = min(vShape, aShape);
    }

    cout << answer << '\n';
    return 0;
}
0