TLE求救
查看原帖
TLE求救
994007
Drewjin楼主2024/12/28 14:26
#include <algorithm>
#include <cstdlib>
#include <iostream>
#include <array>

struct Rabbit {
    int org_idx;
    int place;
    int cur_idx;
    int partner_idx;
    bool finish = false;
};

int n;
std::array<Rabbit, 100000> place_vec;

auto main() -> int {
    // freopen("./data/in.txt", "r", stdin);

    std::cin >> n;
    for (int i = 0; i < n; ++i) {
        std::cin >> place_vec[i].place;
        place_vec[i].org_idx = i;
    }

    std::sort(
        place_vec.begin(), place_vec.begin() + n,
        [](const Rabbit& a, const Rabbit& b) -> bool {
            return a.place < b.place;
        }
    );

    for (int i = 0; i < n; ++i) {
        place_vec[i].cur_idx = i;
    }

    for (int i = 0; i < n; ++i) {
        auto left = i - 1, right = i + 1;
        std::array<int, 2> temp = {-1,-1};
        if (left >= 0) {
            temp[0] = std::abs(
                place_vec[i].place - place_vec[left].place);
        }
        if (right < n) {
            temp[1] = std::abs(
                place_vec[i].place - place_vec[right].place);
        }
        if (temp[0] > temp[1] and temp[1] != -1) {
            place_vec[i].partner_idx = place_vec[right].cur_idx;
        } else if (temp[0] <= temp[1] and temp[0] != -1) {
            place_vec[i].partner_idx = place_vec[left].cur_idx;
        } else if (temp[1] == -1) {
            place_vec[i].partner_idx = place_vec[left].cur_idx;
        } else if (temp[0] == -1) {
            place_vec[i].partner_idx = place_vec[right].cur_idx;
        }
    }

    int remain = n, cur_idx = 0;
    while (remain != 0) {
        auto &cursor = place_vec[cur_idx];
        auto &partner = place_vec[cursor.partner_idx];
        if (cursor.place != partner.place) {
            if (cursor.cur_idx == partner.partner_idx and
                std::abs(cursor.place - partner.place) == 1) {
                if (cursor.place > partner.place) {
                    cursor.place--;
                } else if (cursor.place < partner.place) {
                    partner.place--;
                }
                cursor.finish = true;
                partner.finish = true;
                remain -= 2;
            } else {
                if (cursor.place > partner.place) {
                    cursor.place--;
                    if (cursor.finish) {
                        cursor.finish = false;
                        remain++;
                    }
                } else if (cursor.place < partner.place) {
                    cursor.place++;
                    if (cursor.finish) {
                        cursor.finish = false;
                        remain++;
                    }
                }
                if (cursor.place == partner.place) {
                    remain--;
                    cursor.finish = true;
                }
            }
        }
        cur_idx++;
        if (cur_idx == n) {
            cur_idx = 0;
        }
    }

    std::sort(
        place_vec.begin(), place_vec.begin() + n,
        [](const Rabbit& a, const Rabbit& b) -> bool {
            return a.org_idx < b.org_idx;
        }
    );

    for (int i = 0; i < n; ++i) {
        std::cout << place_vec[i].place << " ";
    }
        
    return 0;
}
2024/12/28 14:26
加载中...