답안 #1075554

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1075554 2024-08-26T07:40:30 Z abouton Sprinklers (CEOI24_sprinklers) C++17
0 / 100
134 ms 2952 KB
#include <bits/stdc++.h>
using namespace std;

int S, F;
int kMin, kMax;
vector<int> sprink;
vector<int> fleurs;
int dernier; 
deque<int> poss;
int possibleS[100000+42];
int possibleF[100000+42];
bool directions[100000+42];
int parQui[100000+42];
int parQuiMin[100000+42];

int val(int a, int b)
{
    if (!b) return fleurs[a];
    return sprink[a];
}

struct objet
{
    int pos;
    int typ;
    bool operator<(const objet &autre) const
    {
        if (val(pos,typ) == val(autre.pos, autre.typ)) return typ < autre.typ;
        return val(pos,typ) < val(autre.pos, autre.typ);
    }
};
vector<objet> fusion;

bool tester(int k)
{
    for (int i = 0; i < F; i ++)
    {
        parQui[i] = -1;
    }
    for (int i = 0; i < S; i ++)
    {
        possibleS[i] = 0;
    }
    for (int i = 0; i < F; i ++)
    {
        possibleF[i] = 0;
    }
    poss.clear();
    //cout << "\n" << k << "\n";
    for (int i = fusion.size()-1; i >=0; i --)
    {
        int endr = val(fusion[i].pos, fusion[i].typ);

        int sorte = fusion[i].typ;
        int ind = fusion[i].pos;
        if (sorte == 1)
        {
            auto ans = upper_bound(fleurs.begin(), fleurs.end(), endr + k);
            if (ans == fleurs.end())
            {   
                possibleS[fusion[i].pos] = true;
            }
            else if (sprink[ind+1] <= fleurs[ans-fleurs.begin()])
            {
                possibleS[ind] = possibleS[ind+1];
            }
            else
            {
                possibleS[fusion[i].pos] = possibleF[ans - fleurs.begin()];
            }
            if (ind != S-1 && sprink[ind+1] <= sprink[ind]+k)
            {
                poss.push_back(ind+1);
            }
            dernier = fusion[i].pos;
            //cout << endr << ' ' << possibleS[fusion[i].pos]  << "\n";
        }

        if (sorte == 0)
        {
            while (!poss.empty() && sprink[poss.front()] > endr + k)
            {
                poss.pop_front();
            }
            if (dernier != 0)
            {
                if (sprink[dernier] <= endr+k)
                {
                    auto ans = upper_bound(fleurs.begin(), fleurs.end(), sprink[dernier]);
                    if (ans != fleurs.end() && possibleF[ans-fleurs.begin()])
                    {
                        possibleF[ind] = true;
                        parQui[ind] = dernier;
                    }
                }
            }
            if (!poss.empty())
            {
                possibleF[ind]= possibleS[poss[0]];
                if (possibleF[ind]) parQui[ind] = poss[0];
            }
            //cout << endr << ' ' << possibleF[ind] << "\n";
            //cout << "poss : ";
            //for (auto u : poss) cout << u << ' ';;
            //cout << '\n';
        }
    }
    //cout << possibleF[0];
    return possibleF[0];
}

int main()
{
    cin >> S >> F;
    sprink.resize(S);
    fleurs.resize(F);
    fusion.resize(S+F);
    for (int i = 0; i < S; i ++) {cin >> sprink[i]; fusion[i] = {i,1};}
    for (int i = 0; i <F; i ++) {cin >> fleurs[i]; fusion[i+S] = {i,0};}
    sort(fusion.begin(), fusion.end());
    kMin = 1;
    kMax = 1e9+10;
    while (kMin < kMax)
    {
        int k = kMin + (kMax-kMin)/2;
        if (tester(k))
        {
            kMax = k;
            for (int i = 0; i < F; i ++) parQuiMin[i] = parQui[i];
        }
        else
        {
            kMin = k+1;
        }
    }
    cout << kMin << "\n";
    for (int i = 0; i < S; i ++)
    {
        directions[parQuiMin[i]] = 1;
    }
    for (int i = 0; i < S; i ++)
    {
        directions[i] ? cout << 'L' : cout << 'R';
    }
    cout << '\n';
    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 344 KB Correct
2 Incorrect 1 ms 348 KB K is out of range
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 348 KB K is out of range
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 344 KB Correct
2 Incorrect 103 ms 2644 KB User solution is worse than jury's solution
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 344 KB Correct
2 Incorrect 1 ms 348 KB K is out of range
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 344 KB Correct
2 Incorrect 134 ms 2952 KB User solution is incorrect
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 344 KB Correct
2 Incorrect 1 ms 348 KB K is out of range
3 Halted 0 ms 0 KB -