Submission #1289964

#TimeUsernameProblemLanguageResultExecution timeMemory
1289964yasiAliens (IOI16_aliens)C++20
60 / 100
525 ms1114112 KiB
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 5e4 + 10;
const long long INF = 1e18 + 10;
vector<vector<pair<long long, int>>> dp;
vector<pair<long long, long long>> it; // fixed long long
stack<pair<int, int>> st;
void Divide_and_Conquer(int ll, int rr, int k, int optl, int optr)
{
    // cout<<"In Solve: "<<ll<<" "<<rr<<" "<<k<<endl;
    if (ll > rr)
    {
        return;
    }
    int mid = (ll + rr) / 2;
    dp[mid][k] = make_pair(INF, 0);
    for (int j = optl; j <= optr; j++)
    {

        if (j == 0)
        {
            // cout<<"Case: 1"<<endl;
            // cout<<it[n].second<<" - "<<it[j].first<<" "<<(it[n].second-it[j].first+1)<<endl;
            dp[mid][k] = min(dp[mid][k], make_pair(1LL * (it[mid].second - it[j].first + 1) * (it[mid].second - it[j].first + 1), j));
            continue;
        }
        /*cout<<"Case: 2"<<endl;
        cout<<dp[j-1][k-1].first<<" + "<<it[n].second<<" - "<<it[j].first<<" "<<(it[n].second-it[j].first+1)
                    <<" "<<it[j-1].second<<" + "<<it[j].first<<" "<<(it[j-1].second-it[j].first+1)<<endl;*/
        dp[mid][k] = min(dp[mid][k], make_pair(dp[j - 1][k - 1].first + (it[mid].second - it[j].first + 1) * (it[mid].second - it[j].first + 1) -
                                                   max(0LL, (it[j - 1].second - it[j].first + 1)) * max(0LL, (it[j - 1].second - it[j].first + 1)),
                                               j));
    }
    // cout<<"Answer: "<<dp[mid][k].first<<" "<<dp[mid][k].second<<endl;
    int opt = dp[mid][k].second;
    Divide_and_Conquer(ll, mid - 1, k, optl, opt);
    Divide_and_Conquer(mid + 1, rr, k, opt, optr);
}
bool cmp(pair<int, int> a, pair<int, int> b)
{
    return a.first < b.first || (a.first == b.first && a.second > b.second);
}
long long take_photos(int n, int m, int k, vector<int> r, vector<int> c)
{
    dp.resize(n, vector<pair<long long, int>>(k + 1, {0, 0})); // fixed k + 1
    for (int i = 0; i < n; i++)
    {
        it.push_back({min(c[i], r[i]), max(c[i], r[i])});
    }
    sort(it.begin(), it.end(), cmp);
    st.push(it[0]);
    for (int i = 1; i < n; i++)
    {
        if (st.size() > 0 && !(st.top().first <= it[i].first && it[i].second <= st.top().second))
        {
            st.push(it[i]);
        }
    }
    it.clear();
    while (!st.empty())
    {
        it.push_back(st.top());
        st.pop();
    }
    reverse(it.begin(), it.end());
    /*for(int i=0;i<it.size();i++){
        cout<<it[i].first<<" "<<it[i].second<<endl;
    }*/
    for (int i = 0; i < it.size(); i++)
    {
        dp[i][1] = make_pair((it[i].second - it[0].first + 1) * (it[i].second - it[0].first + 1), i);
    }
    for (int kk = 2; kk <= k; kk++)
    {
        Divide_and_Conquer(0, it.size() - 1, kk, 0, it.size() - 1);
        // cout<<"After Solve"<<endl;
    }
    return dp[it.size() - 1][k].first;
} /*
 1 4
 2 3
 2 4
 3 8
 4 7
 */

Compilation message (stderr)

aliens.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
aliens_c.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
#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...