Submission #1156004

#TimeUsernameProblemLanguageResultExecution timeMemory
1156004raphaelpPalembang Bridges (APIO15_bridge)C++20
22 / 100
220 ms16792 KiB
#include <bits/stdc++.h>
using namespace std;
long long solve(long long x, vector<vector<long long>> &Tab, long long K, vector<vector<long long>> &Tab2)
{
    long long tot = 0;
    vector<long long> dist(Tab.size()), close;
    for (long long i = 0; i < Tab.size(); i++)
    {
        if (x < Tab[i][0])
        {
            close.push_back(Tab[i][1] + Tab[i][0] - x);
            dist[Tab[i][2]] = (Tab[i][0] - x) * 2;
        }
        if (x > Tab2[i][0])
            dist[Tab2[i][2]] = (x - Tab2[i][0]) * 2;
    }
    sort(close.begin(), close.end());
    for (long long i = 0; i < Tab.size(); i++)
        tot += dist[i];
    if (K == 1)
        return tot;
    long long minn = tot, buff = 0, buff2 = 0, buff3 = 0, open = 0, last = 0, cur = 0;
    while (buff < Tab.size() && Tab[buff][0] <= x)
        buff++;
    for (; buff < Tab.size(); buff++)
    {
        cur = Tab[buff][0];
        last = x;
        if (buff > 0)
            last = max(last, Tab[buff - 1][0]);
        while (buff2 < Tab.size() && Tab2[buff2][0] <= cur)
        {
            if (Tab2[buff2][1] <= x)
            {
                buff2++;
                continue;
            }
            open++;
            tot -= Tab2[buff2][0] - last;
            buff2++;
        }
        while (buff3 < close.size() && close[buff3] <= cur)
        {
            tot += close[buff3] - last;
            open--;
            buff3++;
        }
        tot -= (cur - last) * (Tab.size() - buff) * 2;
        tot += open * (cur - last);
        minn = min(minn, tot);
    }
    return minn;
}
int main()
{
    long long K, N;
    cin >> K >> N;
    long long tot = 0;
    vector<vector<long long>> Tab, Tab2;
    vector<long long> ponts;
    long long buff = 0;
    for (long long i = 0; i < N; i++)
    {
        long long b, d;
        char a, c;
        cin >> a >> b >> c >> d;
        tot += abs(b - d);
        if (a == c)
        {
            continue;
        }
        Tab.push_back({min(b, d), max(b, d), buff});
        Tab2.push_back({max(b, d), min(b, d), buff});
        ponts.push_back(b);
        ponts.push_back(d);
        buff++;
        tot++;
    }
    sort(Tab.begin(), Tab.end());
    sort(Tab2.begin(), Tab2.end());
    sort(ponts.begin(), ponts.end());
    vector<long long> temp;
    if (ponts.size())
        temp.push_back(ponts[0]);
    for (long long i = 1; i < ponts.size(); i++)
        if (ponts[i] != ponts[i - 1])
            temp.push_back(ponts[i]);
    swap(temp, ponts);

    long long L = 0, R = ponts.size() - 1;
    while (L + 2 < R)
    {
        long long delta = (R - L) / 3;
        long long m1 = L + delta, m2 = R - delta;
        if (solve(ponts[m1], Tab, K, Tab2) < solve(ponts[m2], Tab, K, Tab2))
            R = m2;
        else
            L = m1;
    }
    long long minn = 123456789123456789;
    for (long long i = L; i <= R; i++)
        minn = min(minn, solve(ponts[i], Tab, K, Tab2));
    if (ponts.size() == 0)
        minn = 0;
    cout << tot + minn;
}
#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...