Submission #541342

#TimeUsernameProblemLanguageResultExecution timeMemory
541342FatihSolakPalembang Bridges (APIO15_bridge)C++17
100 / 100
350 ms14392 KiB
#include <bits/stdc++.h>
#define N 200005
using namespace std;
struct node{
    int l,r;
    bool operator <(node other){
        return l + r < other.l + other.r;
    }
};
struct median{
    long long suml,sumr;
    multiset<int> l,r;
    void clear(){
        suml = sumr = 0;
        l.clear(),r.clear();
    }
    void addl(int val){
        suml += val;
        l.insert(val);
    }
    void addr(int val){
        sumr += val;
        r.insert(val);
    }
    void erasel(int val){
        suml -= val;
        l.erase(l.find(val));
    }
    void eraser(int val){
        sumr -= val;
        r.erase(r.find(val));
    }
    void add(int val){
        if(l.size() == 0){
            addl(val);
            return;
        }
        if(l.size() == r.size()){
            int num1 = min(val,*r.begin());
            int num2 = max(val,*r.begin());
            addl(num1);
            eraser(*r.begin());
            addr(num2);
        }
        else{
            int num1 = min(val,*l.rbegin());
            int num2 = max(val,*l.rbegin());
            addr(num2);
            erasel(*l.rbegin());
            addl(num1);
        }
    }
    long long get(){
        long long val = *l.rbegin();
        return (val * l.size() - suml) + (sumr - val * r.size());  
    }
};
long long pre[N];
long long suf[N];
void solve(){
    int k,n;
    cin >> k >> n;
    long long sum = 0;
    vector<node> nodes;
    for(int i = 1;i<=n;i++){
        int l,r;
        char x,y;
        cin >> x >> l >> y >> r;
        if(x != y){
            nodes.push_back({l,r});
        }
        else sum += abs(l-r);

    }
    sort(nodes.begin(),nodes.end());
    median m;
    m.clear();
    for(int i=0;i<nodes.size();i++){
        m.add(nodes[i].l);
        m.add(nodes[i].r);
        pre[i+1] = m.get();
    }
    m.clear();
    for(int i=nodes.size()-1;i>=0;i--){
        m.add(nodes[i].l);
        m.add(nodes[i].r);
        suf[i+1] = m.get();
    }
    long long ans = pre[nodes.size()];
    if(k == 2){
        for(int i = 1;i<nodes.size();i++){
            ans = min(ans, pre[i] + suf[i+1]);
        }
    }
    cout << ans + sum + nodes.size();
}

int32_t main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    #ifdef Local
    freopen("in.txt","r",stdin);
    freopen("out.txt","w",stdout);
    #endif
    int t=1;
    //cin>>t;
    while(t--){
        solve();
    }
    #ifdef Local
    cout<<endl<<fixed<<setprecision(2)<<1000.0 * clock() / CLOCKS_PER_SEC<< " milliseconds ";
    #endif
}

Compilation message (stderr)

bridge.cpp: In function 'void solve()':
bridge.cpp:78:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<node>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   78 |     for(int i=0;i<nodes.size();i++){
      |                 ~^~~~~~~~~~~~~
bridge.cpp:91:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<node>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   91 |         for(int i = 1;i<nodes.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...