Submission #14391

#TimeUsernameProblemLanguageResultExecution timeMemory
14391gs14004Palembang Bridges (APIO15_bridge)C++14
100 / 100
206 ms9784 KiB
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <utility>
using namespace std;
typedef pair<int,int> pi;
typedef long long lint;

int n,k;
vector<pi> sol;

lint solve(){
    if(sol.empty()) return 0;
    vector<int> ret;
    for(auto i : sol){
        ret.push_back(i.first);
        ret.push_back(i.second);
    }
    sort(ret.begin(),ret.end());
    int med = ret[ret.size()/2];
    lint res = 0;
    for(auto i : ret){
        lint t = i;
        t -= med;
        res += max(t,-t);
    }
    return res;
}

bool cmp(pi a, pi b){
    return a.first + a.second < b.first + b.second;
}

vector<int> cand;

struct bit{
    lint tree[200005];
    int piv;
    void init(int n){
        piv = n+2;
        memset(tree,0,sizeof(tree));
    }
    void add(int x, int v){
        x += 2;
        while(x <= piv){
            tree[x] += v;
            x += x & -x;
        }
    }
    int kth(int k){
        int p = 0;
        for(int i=17; i>=0; i--){
            if((p|1<<i) <= piv && tree[p|(1<<i)] < k){
                p |= 1<<i;
                k -= tree[p];
            }
        }
        return p-1;
    }
    lint sum(int x){
        x += 2;
        lint ret = 0;
        while(x){
            ret += tree[x];
            x -= x & -x;
        }
        return ret;
    }
    lint sum_range(int s, int e){
        return sum(e) - sum(s-1);
    }
}bit1, bit2;

lint dp1[100005], dp2[100005];

lint solve2(){
    if(sol.empty()) return 0;
    sort(sol.begin(), sol.end(), cmp);
    for (auto &i : sol){
        cand.push_back(i.first);
        cand.push_back(i.second);
    }
    sort(cand.begin(), cand.end());
    cand.resize(unique(cand.begin(),cand.end()) - cand.begin());
    for (auto &i : sol){
        i.first = (int)(lower_bound(cand.begin(),cand.end(),i.first) - cand.begin());
        i.second = (int)(lower_bound(cand.begin(),cand.end(),i.second) - cand.begin());
    }
    bit1.init((int)cand.size());
    bit2.init((int)cand.size());
    for (int i=0; i<sol.size(); i++){
        pi t = sol[i];
        bit1.add(t.first,1);
        bit1.add(t.second,1);
        bit2.add(t.first,cand[t.first]);
        bit2.add(t.second,cand[t.second]);
        int piv = bit1.kth(i+1);
        dp1[i] += bit2.sum_range(piv+1,(int)cand.size()-1);
        dp1[i] -= bit1.sum_range(piv+1,(int)cand.size()-1) * cand[piv];
        dp1[i] += bit1.sum_range(0,piv-1) * cand[piv];
        dp1[i] -= bit2.sum_range(0,piv-1);
    }
    bit1.init((int)cand.size());
    bit2.init((int)cand.size());
    for (int i=(int)sol.size()-1; i>=0; i--) {
        pi t = sol[i];
        bit1.add(t.first,1);
        bit1.add(t.second,1);
        bit2.add(t.first,cand[t.first]);
        bit2.add(t.second,cand[t.second]);
        int piv = bit1.kth((int)sol.size()-i);
        dp2[i] += bit2.sum_range(piv+1,(int)cand.size()-1);
        dp2[i] -= bit1.sum_range(piv+1,(int)cand.size()-1) * cand[piv];
        dp2[i] += bit1.sum_range(0,piv-1) * cand[piv];
        dp2[i] -= bit2.sum_range(0,piv-1);
    }
    lint ans = 1e18;
    for (int i=0; i<=sol.size(); i++) {
        ans = min(ans,(i ? dp1[i-1] : 0) + dp2[i]);
    }
    return ans;
}

int main(){
    lint ret = 0;
    scanf("%d %d",&k,&n);
    for(int i=0; i<n; i++){
        char s1[5], s2[5];
        int t,u;
        scanf("%s %d %s %d",s1,&t,s2,&u);
        if(t > u) swap(t,u);
        if(s1[0] != s2[0]){
            sol.push_back(pi(t,u));
        }
        else{
            ret += u - t - 1;
        }
    }
    ret += n;
    if(k == 1) ret += solve();
    else ret += solve2();
    printf("%lld",ret);
}

Compilation message (stderr)

bridge.cpp: In function 'lint solve2()':
bridge.cpp:93:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i=0; i<sol.size(); i++){
                    ^
bridge.cpp:120:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i=0; i<=sol.size(); i++) {
                    ^
bridge.cpp: In function 'int main()':
bridge.cpp:128:25: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d %d",&k,&n);
                         ^
bridge.cpp:132:41: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%s %d %s %d",s1,&t,s2,&u);
                                         ^
#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...