제출 #1217391

#제출 시각아이디문제언어결과실행 시간메모리
1217391rkgenaPalembang Bridges (APIO15_bridge)C++20
100 / 100
171 ms12124 KiB
#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
#define IOS ios::sync_with_stdio(0); cin.tie(0);
#define lli long long int
#define pb push_back
#define all(x) x.begin(),x.end()
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define repp(i,a,b) for(int i=a;i>=b;i--)
#define vi vector<lli>
#define vvi vector<vi>
#define vpi vector<pair<lli,lli>>
#define pi pair<lli,lli>
#define msi multiset<lli>
#define mspi multiset<pair<lli,lli>>
#define mii map<lli,lli>
#define mpi map<pair<lli,lli>,lli>
#define si set<lli>
#define spi set<pair<lli,lli>>
#define qi queue<lli>
#define pqi priority_queue<lli>
#define pqimin priority_queue<lli,vi,greater<lli>>
#define geti(n) lli n; cin>>n;
#define get2i(n,m) lli n,m; cin>>n>>m;
#define get3i(n,m,k) lli n,m,k; cin>>n>>m>>k;
#define getvi(v,n) vi v(n); for(lli i=0;i<n;i++) cin>>v[i];
#define getvvi(v,n,m) vvi v(n,vi(m)); for(lli i=0;i<n;i++) for(lli j=0;j<m;j++) cin>>v[i][j];
#define getvpi(v,n) vpi v(n); for(lli i=0;i<n;i++) cin>>v[i].first>>v[i].second;
#define getpi (p) pi p; cin>>p.first>>p.second;
#define getmii(m,n) mii m; for(lli i=0;i<n;i++) { lli a,b; cin>>a>>b; m[a]=b; }
#define getstr(s) string s; cin>>s;
template<class T> using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
template<class T1, class T2> using ordered_map = tree<T1, T2, less<T1>, rb_tree_tag, tree_order_statistics_node_update>;
void print(lli n) { cout << n << "\n"; }
void print(lli n, lli m) { cout << n << " " << m << "\n"; }
void print(lli n, lli m, lli k) { cout << n << " " << m << " " << k << "\n"; }
void print(vi v) { for (auto i : v) cout << i << " "; cout << "\n"; }
void print(vvi v) { for (auto i : v) { for (auto j : i) cout << j << " "; cout << "\n"; } }
void print(string s) { cout << s << "\n"; }

const lli MOD = 1e9 + 7;

msi m1, m2;
lli sum1, sum2;

void pusher(lli x) {
    lli median = (m1.size() ? *m1.rbegin() : 1000000001);
    if (x <= median) {
        m1.insert(x);
        sum1 += x;
    } else {
        m2.insert(x);
        sum2 += x;
    }
    
    while (m2.size() + 1 < m1.size()) {
        lli mover = *m1.rbegin();
        m1.erase(m1.find(mover));
        m2.insert(mover);
        sum1 -= mover;
        sum2 += mover;
    }
    while (m1.size() < m2.size()) {
        lli mover = *m2.begin();
        m2.erase(m2.find(mover));
        m1.insert(mover);
        sum2 -= mover;
        sum1 += mover;
    }
}

void solve() {
    get2i(k, n);
    
    lli ans = 0;
    vpi st;
    st.pb({0, 0});
    
    rep(i, 0, n-1) {
        char start, end;
        lli a, b;
        cin >> start >> a >> end >> b;
        if (start == end) {
            ans += abs(a - b);
        } else {
            st.pb({a, b});
        }
    }
    
    sort(all(st), [](pi a, pi b) { return a.first + a.second < b.first + b.second; });
    n = st.size() - 1;
    ans += n;
    
    vi pref(n + 1);
    sum1 = sum2 = 0;
    
    rep(i, 1, n) {
        pusher(st[i].first);
        pusher(st[i].second);
        pref[i] = sum2 - sum1;
    }
    
    lli solver = pref[n];
    
    if (k == 2) {
        m1.clear();
        m2.clear();
        sum1 = sum2 = 0;
        
        repp(i, n, 1) {
            pusher(st[i].first);
            pusher(st[i].second);
            solver = min(solver, sum2 - sum1 + pref[i - 1]);
        }
    }
    
    cout << ans + solver << "\n";
}
 
signed main() {
    IOS 
    int t = 1;
    while(t--) {
        solve();
    }
    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...