Submission

Status:

[PP-SS][SSSSS][SSSSSSSSSS]

Score: 0

User: Cmoss9

Problemset: ห้องสมุดเมือง 3M

Language: cpp

Time: 0.003 second

Submitted On: 2025-03-18 22:00:01

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    int n; // จำนวนห้องสมุด
    cin >> n;

    vector<pair<int, int>> ranges(n);
    int max_val = 0; // ค่ามากสุดที่พบในช่วง
    int total_books = 0; // จำนวนหนังสือทั้งหมด

    // รับข้อมูลช่วง Xi และ Yi ของแต่ละห้องสมุด
    for (int i = 0; i < n; i++) {
        cin >> ranges[i].first >> ranges[i].second;
        total_books += (ranges[i].second - ranges[i].first); // คำนวณจำนวนหนังสือทั้งหมด
        max_val = max(max_val, ranges[i].second); // หาค่ามากสุดในช่วง
    }

    // ใช้ vector เพื่อเก็บจำนวนหนังสือในแต่ละจำนวนตัวอักษร
    vector<int> freq(max_val + 1, 0);

    // เพิ่มความถี่ในอาร์เรย์สำหรับแต่ละช่วง
    for (int i = 0; i < n; i++) {
        for (int j = ranges[i].first; j < ranges[i].second; j++) {
            freq[j]++;
        }
    }

    // คำนวณตำแหน่งของค่ามัธยฐาน (ตำแหน่งที่ K / 2)
    int half = total_books / 2;
    int accumulated = 0;
    int median = -1;

    // ถ้าจำนวนข้อมูลทั้งหมดเป็นเลขคู่
    if (total_books % 2 == 0) {
        int first_middle = -1, second_middle = -1;

        // หา 2 ค่าที่อยู่กลาง
        for (int i = 0; i <= max_val; i++) {
            accumulated += freq[i];

            if (accumulated >= half && first_middle == -1) {
                first_middle = i;
            }

            if (accumulated > half) {
                second_middle = i;
                break;
            }
        }

        // คำนวณค่ามัธยฐานจากค่า 2 ค่า
        median = (first_middle + second_middle) / 2;
    } else {
        // ถ้าจำนวนข้อมูลทั้งหมดเป็นเลขคี่
        for (int i = 0; i <= max_val; i++) {
            accumulated += freq[i];
            if (accumulated >= half) {
                median = i;
                break;
            }
        }
    }

    // แสดงผลค่ามัธยฐาน
    cout << median << endl;

    return 0;
}