제출 #1321974

#제출 시각아이디문제언어결과실행 시간메모리
1321974HoriaHaivasSprinklers (CEOI24_sprinklers)C++20
9 / 100
2095 ms6776 KiB
#include<bits/stdc++.h>
#define debug(x) cerr << #x << " " << x << "\n"
#define debugs(x) cerr << #x << " " << x << " "
#pragma GCC optimize("Ofast")
#define int long long

using namespace std;

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

int range_rng(int l, int r)
{
    return uniform_int_distribution<int>(l,r)(rng);
}

int s[100005];
int f[100005];
int dir[100005];
int last1[100005];
int last2[100005];
vector<int> ls,rs;
string bigmeeks;
int dp[100005];
int n,m;

bool ok(int k)
{
    int i,r,pas,bound,last,j,furthest1,closest1,l;
    bool oke;
    string config;
    dp[0]=0;
    last1[0]=0;
    last2[0]=0;
    for (i=1; i<=n; i++)
    {
        dp[i]=-1e18;
        ///L
        r=last1[i-1];
        while (r+1<=m && f[r+1]<s[i]-k)
               r++;
        last1[i]=r;
        if (r<=dp[i-1])
        {
            r=last2[i-1];
            while (r+1<=m && f[r+1]<=s[i])
                   r++;
            last2[i]=r;
            if (r>dp[i])
            {
                dp[i]=r;
                dir[i]=1;
            }
        }
        ///R
        r=0;
        pas=(1<<16);
        while (pas)
        {
            if (r+pas<=m && f[r+pas]<s[i])
                r+=pas;
            pas=pas/2;
        }
        if (r<=dp[i-1])
        {
            r=0;
            pas=(1<<16);
            while (pas)
            {
                if (r+pas<=m && f[r+pas]<=s[i]+k)
                    r+=pas;
                pas=pas/2;
            }
            if (r>dp[i])
            {
                dp[i]=r;
                dir[i]=2;
            }
        }
        ///RL
        if (i>=2)
        {
            r=0;
            pas=(1<<16);
            while (pas)
            {
                if (r+pas<=m && f[r+pas]<s[i]-k)
                    r+=pas;
                pas=pas/2;
            }
            if (r<=dp[i-2])
            {
                r=0;
                pas=(1<<16);
                while (pas)
                {
                    if (r+pas<=m && f[r+pas]<=s[i-1]+k)
                        r+=pas;
                    pas=pas/2;
                }
                if (r>dp[i])
                {
                    dp[i]=r;
                    dir[i]=3;
                }
            }
        }
        if (dp[i]==-1e18)
            return 0;
    }
    if (dp[n]!=m)
        return 0;
    config="";
    j=n;
    while (j!=0)
    {
        if (dir[j]==1)
        {
            config+='L';
            j--;
        }
        else if (dir[j]==2)
        {
            config+='R';
            j--;
        }
        else if (dir[i]==3)
        {
            config+="LR";
            j-=2;
        }
    }
    config+="$";
    reverse(config.begin(),config.end());
    ls.clear();
    rs.clear();
    for (i=1; i<=n; i++)
    {
        if (config[i]=='L')
            ls.push_back(s[i]);
        else
            rs.push_back(s[i]);
    }
    oke=true;
    for (i=1; i<=m; i++)
    {
        r=-1;
        pas=(1<<16);
        while (pas)
        {
            if (r+pas<rs.size() && rs[r+pas]<=f[i])
                r+=pas;
            pas=pas/2;
        }
        if (r==-1 || rs[r]+k<f[i])
        {
            r=-1;
            pas=(1<<16);
            while (pas)
            {
                if (r+pas<ls.size() && ls[r+pas]<f[i])
                    r+=pas;
                pas=pas/2;
            }
            r++;
            if (r>=ls.size() || ls[r]>f[i] && ls[r]-k>f[i] || ls[r]<f[i])
                oke=false;
        }
    }
    if (oke)
        bigmeeks=config;
    return oke;
}

signed main()
{
    /*
    ifstream fin("arbore.in");
    ofstream fout("arbore.out");
    */
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int i,j,cnt,r,pas;
    cin >> n >> m;
    for (i=1; i<=n; i++)
        cin >> s[i];
    for (i=1; i<=m; i++)
        cin >> f[i];
    if (!ok(1e9))
    {
        cout << "-1";
    }
    else
    {
        r=0;
        pas=(1<<30);
        while(pas)
        {
            if (!ok(r+pas))
                r+=pas;
            pas=pas/2;
        }
        if (!ok(r))
            r++;
        ok(r);///stiu ca e cringe da na
        cout << r << "\n";
        for (i=1; i<=n; i++)
            cout << bigmeeks[i];
    }
    return 0;
}
#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...