Submission #347098

#TimeUsernameProblemLanguageResultExecution timeMemory
347098ali_tavakoliPalembang Bridges (APIO15_bridge)C++14
100 / 100
84 ms8672 KiB
//In the name of Allah
#include<bits/stdc++.h>
using namespace std;
    
typedef long long ll;
#define endl '\n'
#define F first
#define S second
#define pb push_back
#define all(x) x.begin(), x.end()
#pragma GCC optimize("O2")
    
const int N = 1e5 + 5;
    
int n, k, med[N][2], med2[N][2], p, q;
char ch1, ch2;
ll base, ans1[N], ans2[N];
    
vector<pair<ll, pair<int, int> > > ve;
    
priority_queue<int> q1, q3;
priority_queue<int, vector<int>, greater<int> > q2, q4;
    
int main()
{
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    
    ve.reserve(N);
    cin >> k >> n;
    for(int i = 0; i < n; i++)
    {
        cin >> ch1 >> p >> ch2 >> q;
        //scanf("%c%d%c%d", &ch1, &p, &ch2, &q);
        if(ch1 != ch2)
            ve.pb({p + q, {min(p, q), max(p, q)}});
        else
            base += abs(p - q);
    }
    base += ve.size();
    sort(all(ve));
    
    ll s1 = 0, s2 = 0;
    for(int i = 0; i < ve.size(); i++)
    {
        auto x = ve[i];
    
        q1.push(x.S.F);
        s1 += x.S.F;
        q2.push(x.S.S);
        s2 += x.S.S;
        while(q1.top() > q2.top())
        {
            ll to1 = q1.top(), to2 = q2.top();
            q1.pop();q2.pop();
            q1.push(to2);
            s1 -= to1, s1 += to2;
            q2.push(to1);
            s2 -= to2, s2 += to1;
        }
        ans1[i] = q1.top() * q1.size() - s1 + s2 - q1.top() * q2.size();
        med[i][0] = q1.top();
        med[i][1] = q2.top();
    }
    
    //cout << med[ve.size() - 1][0] << " " << med[ve.size() - 1][1] << endl;
    
    //if(!n)
        //cout << base << endl;
    
    if(!ve.size())
    {
        cout << base << endl;
        return 0;
    }
    
    if(k == 1|| ve.size() == 1)
    {
        ll ans1, ans2;
        ans1 = ans2 = 0;
        for(int i = 0; i < ve.size(); i++)
        {
            ans1 += abs(ve[i].S.F - med[ve.size() - 1][0]);
            ans1 += abs(ve[i].S.S - med[ve.size() - 1][0]);
            ans2 += abs(ve[i].S.F - med[ve.size() - 1][1]);
            ans2 += abs(ve[i].S.S - med[ve.size() - 1][1]);
        }
        cout << min(ans1, ans2) + base << endl;
    }
    else
    {
        //cout << "BOOOM\n";
        ll ans = 1e15 + 5;
        ll s3 = 0, s4 = 0;
        
        for(int i = ve.size() - 1; i >= 0; i--)
        {
            auto x = ve[i];
    
            q3.push(x.S.F);
            s3 += x.S.F;
            q4.push(x.S.S);
            s4 += x.S.S;
            while(q3.top() > q4.top())
            {
                ll to1 = q3.top(), to2 = q4.top();
                q3.pop();q4.pop();
                q3.push(to2);
                s3 -= to1, s3 += to2;
                q4.push(to1);
                s4 -= to2, s4 += to1;
            }
            //cout << q3.top() * q3.size() << " " << s3 << '\n';
            ans2[i] = q3.top() * q3.size() - s3 + s4 - q3.top() * q4.size();
            //if(ans2[i] == 0)
               // cout << q3.top() << " " << q3.size() << " " << s3 << " " << s4 << " " << q4.top() << " " << q4.size() << '\n';
            //med2[i][0] = q3.top();
            //med2[i][1] = q4.top();
            if(i == 0)
                ans = min(ans, ans2[i]);
            else
                {
                    //cout << ans << " ";
                    ans = min(ans, ans2[i] + ans1[i - 1]);
                    //cout << ans << " " << ans2[i] + ans1[i - 1] << '\n';
                    //cout << i << " " << ans2[i] << " " << ans1[i - 1] << '\n';
                }
        }
        ans = min(ans, ans1[ve.size() - 1]);
    
        /*for(int i = 0; i < ve.size() - 1; i++)
        {
            ll ans1, ans2, ans3, ans4;
            ans1 = ans2 = ans3 = ans4 = 0;
            for(int j = 0; j <= i; j++)
            {
                ans1 += abs(ve[j].S.F - med[i][0]);
                ans1 += abs(ve[j].S.S - med[i][0]);
                ans2 += abs(ve[j].S.F - med[i][1]);
                ans2 += abs(ve[j].S.S - med[i][1]);
            }
            for(int j = i + 1; j < ve.size(); j++)
            {
                ans3 += abs(ve[j].S.F - med2[i + 1][0]);
                ans3 += abs(ve[j].S.S - med2[i + 1][0]);
                ans4 += abs(ve[j].S.F - med2[i + 1][1]);
                ans4 += abs(ve[j].S.S - med2[i + 1][1]);
            }
            
            ans = min(ans, min(ans1, ans2) + min(ans3, ans4));
        }
    
        ll ans1, ans2;
        ans1 = ans2 = 0;
        for(int i = 0; i < ve.size(); i++)
        {
            ans1 += abs(ve[i].S.F - med[ve.size() - 1][0]);
            ans1 += abs(ve[i].S.S - med[ve.size() - 1][0]);
            ans2 += abs(ve[i].S.F - med[ve.size() - 1][1]);
            ans2 += abs(ve[i].S.S - med[ve.size() - 1][1]);
        }
        ans = min(ans, min(ans1, ans2));*/
        //cout << base << '\n';
        //cout << ans << '\n';
        cout << ans + base << endl;
    }
}

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

Compilation message (stderr)

bridge.cpp: In function 'int main()':
bridge.cpp:43:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, std::pair<int, int> > >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   43 |     for(int i = 0; i < ve.size(); i++)
      |                    ~~^~~~~~~~~~~
bridge.cpp:80:26: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, std::pair<int, int> > >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   80 |         for(int i = 0; i < ve.size(); i++)
      |                        ~~^~~~~~~~~~~
#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...