제출 #1196055

#제출 시각아이디문제언어결과실행 시간메모리
1196055raphaelpA Light Inconvenience (CEOI23_light)C++20
0 / 100
0 ms408 KiB
#include <bits/stdc++.h>
#include "light.h"
using namespace std;
#define LSOne(S) ((S) & (-S))

void prepare() {}
long long tot = 0;
vector<pair<long long, long long>> Runners;
vector<long long> something;
pair<long long, vector<long long>> join(long long x)
{
    pair<long long, vector<long long>> ans;
    ans.first = x;
    tot += x;
    for (long long i = 0; i < Runners.size(); i++)
        Runners[i].second = min(Runners[i].second + x, Runners[i].first + LSOne(Runners[i].first) - 1);
    long long buff = Runners.size() - 1;
    long long temp = tot;
    for (long long j = 1; j < tot; j *= 2)
        ans.second.push_back(j);
    ans.second.push_back(0);
    ans.second.push_back(tot);
    for (long long i = 0; i < something.size(); i++)
        if (something[i] + 2 * LSOne(something[i]) > tot && something[i] < tot)
            ans.second.push_back(something[i]);
    while (temp != LSOne(temp))
    {
        while (buff >= 0 && Runners[buff].first > temp - (2 * LSOne(temp)))
            buff--;
        if (buff == -1 || Runners[buff].first != temp - (2 * LSOne(temp)))
        {
            Runners.push_back({temp - 2 * LSOne(temp), temp - 2 * LSOne(temp) + temp - tot});
            buff++;
            swap(Runners.back(), Runners[buff]);
        }
        long long temp2 = Runners[buff].first;
        for (long long j = LSOne(temp2) / 2; j; j /= 2)
        {
            ans.second.push_back(temp2);
            temp2 += j;
            if (Runners[buff].second < temp2)
                break;
        }
        ans.second.push_back(Runners[buff].second);
        temp += LSOne(temp);
    }
    if (LSOne(tot) == tot)
    {
        for (long long j = tot - LSOne(tot) / 2; j < tot; j += (LSOne(j) + 1) / 2)
            ans.second.push_back(j);
    }
    else
        ans.second.push_back(tot - LSOne(tot));
    vector<pair<long long, long long>> Run;
    for (long long i = 0; i < Runners.size(); i++)
        if (Runners[i].first + 2 * LSOne(Runners[i].first) >= tot)
            Run.push_back(Runners[i]);
    sort(Run.begin(), Run.end());
    swap(Run, Runners);
    sort(ans.second.begin(), ans.second.end());
    vector<long long> ans2;
    for (long long i = 0; i < ans.second.size(); i++)
    {
        if (i == 0 || ans.second[i] != ans.second[i - 1])
            ans2.push_back(ans.second[i]);
    }
    something = ans2;
    for (long long i = 0; i < ans2.size(); i++)
        ans2[i]++;
    swap(ans.second, ans2);
    return ans;
}
pair<long long, vector<long long>> leave(long long x)
{
    pair<long long, vector<long long>> ans;
    ans.first = x;
    tot -= x;
    for (long long i = 0; i < Runners.size(); i++)
        Runners[i].second = min(Runners[i].second + x, Runners[i].first + LSOne(Runners[i].first) - 1);
    long long buff = Runners.size() - 1;
    long long temp = tot;
    for (long long j = 1; j < tot; j *= 2)
        ans.second.push_back(j);
    ans.second.push_back(0);
    ans.second.push_back(tot);
    for (long long i = 0; i < something.size(); i++)
        if (something[i] + 2 * LSOne(something[i]) > tot && something[i] < tot)
            ans.second.push_back(something[i]);
    while (temp != LSOne(temp))
    {
        while (buff >= 0 && Runners[buff].first > temp - (2 * LSOne(temp)))
            buff--;
        if (buff == -1 || Runners[buff].first != temp - (2 * LSOne(temp)))
        {
            Runners.push_back({temp - 2 * LSOne(temp), temp - 2 * LSOne(temp) + temp - tot});
            buff++;
            swap(Runners.back(), Runners[buff]);
        }
        long long temp2 = Runners[buff].first;
        for (long long j = LSOne(temp2) / 2; j; j /= 2)
        {
            ans.second.push_back(temp2);
            temp2 += j;
            if (Runners[buff].second < temp2)
                break;
        }
        ans.second.push_back(Runners[buff].second);
        temp += LSOne(temp);
    }
    if (LSOne(tot) == tot)
    {
        for (long long j = tot - LSOne(tot) / 2; j < tot; j += (LSOne(j) + 1) / 2)
            ans.second.push_back(j);
    }
    else
        ans.second.push_back(tot - LSOne(tot));
    vector<pair<long long, long long>> Run;
    for (long long i = 0; i < Runners.size(); i++)
        if (Runners[i].first + 2 * LSOne(Runners[i].first) >= tot)
            Run.push_back(Runners[i]);
    sort(Run.begin(), Run.end());
    swap(Run, Runners);
    sort(ans.second.begin(), ans.second.end());
    vector<long long> ans2;
    for (long long i = 0; i < ans.second.size(); i++)
    {
        if (i == 0 || ans.second[i] != ans.second[i - 1])
            ans2.push_back(ans.second[i]);
    }
    something = ans2;
    for (long long i = 0; i < ans2.size(); i++)
        ans2[i]++;
    swap(ans.second, ans2);
    return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...