Submission #1098838

#TimeUsernameProblemLanguageResultExecution timeMemory
1098838trinhbaongoc3006Palembang Bridges (APIO15_bridge)C++17
100 / 100
169 ms13752 KiB
#include <bits/stdc++.h>
#define INF int64_t(1e9)
#define pii pair <int, int>
#define pll pair <long long, long long>
#define mp make_pair
#define file "test"
using namespace std;
const int nmax = 2e5 + 5;
const long long mod = 1e9 + 7;

int n,k;
long long sLow = 0 , sUp = 0, pref[nmax];
long long res = 0;
multiset <int> low, up;
vector <pii> v;
bool cmp(pii a, pii b)
{
    return (a.first + a.second < b.first + b.second);
}
void add(int val)
{
    int a = (low.size() ? *low.rbegin() : INF+5);
    if (val <= a)
    {
        sLow += val;
        low.insert(val);
    }
    else
    {
        sUp += val;
        up.insert(val);
    }
    if (up.size() + 1 < low.size())
    {
        int w = *low.rbegin();
        up.insert(w);
        low.erase(low.find(w));
        sUp += w;
        sLow -= w;
    }
    else if (low.size() < up.size())
    {
        int w = *up.begin();
        low.insert(w);
        up.erase(up.find(w));
        sUp -= w;
        sLow += w;
    }
}
void ers(int val)
{
    if (up.find(val) != up.end()) up.erase(up.find(val)),sUp-=val;
    else low.erase(low.find(val)),sLow-=val;
    if (low.empty())
    {
        low.insert(*up.begin());
        sLow+=*up.begin();
        sUp-=*up.begin();
        up.erase(up.find(*up.begin()));
    }
}
int main()
{
    ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
    //freopen(file".inp","r",stdin);
    //freopen(file".out","w",stdout);
    cin >> k >> n;
    v.push_back(mp(0,0));
    for (int i=1;i<=n;i++)
    {
        char a, b;
        int x, y;
        cin >> a >> x >> b >> y;
        if (a == b) res += abs(x-y);
        else
        {
            v.push_back(mp(x,y));
        }
    }
    n = v.size() - 1;
    res+=n;
    sort(v.begin(), v.end(), cmp);
    for (int i=1;i<=n+1;i++)
    {
        add(v[i].first);
        add(v[i].second);
        pref[i] = sUp - sLow;
    }
    long long ans = pref[n];
    if (k == 2)
    {
        up.clear();
        low.clear();
        sUp = 0;
        sLow = 0;
        for (int i=n;i;i--)
        {
            add(v[i].first);
            add(v[i].second);
            ans = min(ans, sUp - sLow + pref[i-1]);
        }
    }
    cout << ans + res ;
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...