제출 #1321892

#제출 시각아이디문제언어결과실행 시간메모리
1321892NValchanovPalembang Bridges (APIO15_bridge)C++20
100 / 100
141 ms13144 KiB
#include<bits/stdc++.h>
using namespace std;

void speed()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
}

typedef long long llong;

const int MAXN = 1e5 + 10;
const int INF = 1e9 + 10;

struct Person
{
    int s, t;

    Person(){};

    Person(int s, int t)
    {
        this->s = s;
        this->t = t;
    }

    friend bool operator<(const Person &p1, const Person &p2)
    {
        return (p1.s + p1.t) < (p2.s + p2.t);
    }
};

llong same;
vector < Person > v;
int n, k;
char p[MAXN];
int s[MAXN];
char q[MAXN];
int t[MAXN];
multiset < int > lhalf, rhalf;

llong pref[MAXN];
llong suff[MAXN];
llong lhalfsum;
llong rhalfsum;

void read()
{
    cin >> k >> n;

    for(int i = 1; i <= n; i++)
    {
        cin >> p[i] >> s[i] >> q[i] >> t[i];

        if(p[i] == q[i])
        {
            same += abs(t[i] - s[i]);
        }
        else
        {
            v.push_back(Person(s[i], t[i]));
        }
    }

    sort(v.begin(), v.end());

    n = v.size();
}

void add(int val)
{
    int median;

    if(lhalf.empty())
        median = INF;
    else
        median = *lhalf.rbegin();

    if(val <= median)
    {
        lhalf.insert(val);
        lhalfsum += val;
    }
    else
    {
        rhalf.insert(val);
        rhalfsum += val;
    }

    if((int)rhalf.size() - (int)lhalf.size() > 1)
    {
        auto it = rhalf.begin();
        int trans = *it;

        rhalf.erase(it);
        rhalfsum -= trans;

        lhalf.insert(trans);
        lhalfsum += trans;
    }
    else if((int)lhalf.size() - (int)rhalf.size() > 1)
    {
        auto it = prev(lhalf.end());
        int trans = *it;

        lhalf.erase(it);
        lhalfsum -= trans;

        rhalf.insert(trans);
        rhalfsum += trans;
    }
}

void find_pref()
{
    lhalf.clear();
    rhalf.clear();

    lhalfsum = rhalfsum = 0;

    for(int i = 1; i <= n; i++)
    {
        add(v[i - 1].s);
        add(v[i - 1].t);

        pref[i] = rhalfsum - lhalfsum;
    }
}

void find_suff()
{
    lhalf.clear();
    rhalf.clear();

    lhalfsum = rhalfsum = 0;

    for(int i = n; i >= 1; i--)
    {
        add(v[i - 1].s);
        add(v[i - 1].t);

        suff[i] = rhalfsum - lhalfsum;
    }
}

void solve_k1()
{
    cout << (same + pref[n] + n) << endl;
}

void solve_k2()
{
    llong ans = pref[n];

    for(int i = 1; i <= n; i++)
    {
        ans = min(ans, pref[i] + suff[i + 1]);
    }

    cout << (same + ans + n) << endl;
}

void solve()
{
    if(k == 1)
        solve_k1();
    else
        solve_k2();
}

int main()
{
    speed();
    read();
    find_pref();
    find_suff();
    solve();

	return 0;
}
/**

1 5
B 0 A 4
B 1 B 3
A 5 B 7
B 2 A 6
B 1 A 7

*/
#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...