Submission #1253968

#TimeUsernameProblemLanguageResultExecution timeMemory
1253968nerrrminFire (BOI24_fire)C++20
31 / 100
29 ms6984 KiB
#include<bits/stdc++.h>
#define endl '\n'
#define pb push_back
using namespace std;
const long long maxn = 905;
void speed()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
}
long long n, m;
long long s[maxn], e[maxn];
map < long long, long long > mp;
vector < long long > u;

vector < long long > g[maxn];
int dp[maxn][maxn];
int over[maxn][maxn];
int pref[maxn][maxn];
vector < pair < int, int > > day, night;
int main()
{
    speed();

    cin >> n >> m;
    for (long long i = 1; i <= n; ++ i)
    {
        cin >> s[i] >> e[i];
        u.pb(s[i]);
        u.pb(e[i]);
    }
    u.pb(0);
    u.pb(m);
    sort(u.begin(), u.end());
    int cnt = 0, last = -1;
    for (auto x: u)
    {
        if(x != last)
        {
            cnt ++;
            mp[x] = cnt;
        }
        last = x;
    }
    int lt = mp[0], rt = mp[m];
    for (int i = 1; i <= n; ++ i)
    {
        s[i] = mp[s[i]];
        e[i] = mp[e[i]];
    }
    for (int i = 0; i <= rt + 10; ++ i)
    {
        for (int j = 0; j <= rt + 10; ++ j)
        {
            dp[i][j] = 1e9;
            over[i][j] = 1e9;
            pref[i][j] = 1e9;
        }
    }
    for (int i = 1; i <= n; ++ i)
    {
        if(s[i] <= e[i])
        {
            day.pb({s[i], e[i]});
            dp[s[i]][e[i]] = 1;
        }
        else
        {
            night.pb({e[i], s[i]});
            over[e[i]][s[i]] = 1;
        }
    }

    for (int len = 1; len <= rt; ++ len)
    {
        for (int i = lt; i <= rt; ++ i)
        {
            int j = i + len - 1;

           // cout << i << " " << j << " - > " << dp[i][j] << endl;
            if(j > rt)continue;
            if(dp[i][j] == 1e9)continue;
            for (auto &[l, r]: day)
            {
                if(r < i || l > j)continue;
                int rangel = min(l, i);
                int ranger = max(j, r);
                dp[rangel][ranger] = min(dp[rangel][ranger], dp[i][j] + 1);
            }
           // cout << dp[i][j] << endl;
        }
    }

    for (int i = 1; i <= rt; ++ i)
    {
        for (int j = rt; j >= 1; -- j)
        {
           // cout << i << " " << j << " -> " << over[i][j] << endl;
            if(over[i][j] == 1e9)continue;
            for (auto &[l, r]: night)
            {
                int rangel = max(l, i);
                int ranger = min(j, r);
                over[rangel][ranger] = min(over[rangel][ranger], over[i][j] + 1);
            }
        }
    }

    for (int len = rt; len >= 1; -- len)
    {
        for (int i = 1; i <= rt; ++ i)
        {
            int j = i + len - 1;
            if(j > rt)continue;
            pref[i][j] = min(min(pref[i][j], pref[i-1][j]), dp[i][j]);
            if(j < rt)pref[i][j] = min(pref[i][j], pref[i][j+1]);

            //cout << i << " " << j << " pref is " << pref[i][j] << endl;
        }
    }
    int ans = 1e9;
    for (int i = 1; i <= rt; ++ i)
    {
        for (int j = 1; j <= rt; ++ j)
        {
            //cout << i << " " << j << " anddd " << pref[i][j] << endl;
            ans = min(ans, pref[i][j] + over[i][j]);
        }
    }
    if(ans == 1e9)cout << -1 << endl;
    else cout << ans << endl;
    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...