Submission #23777

#TimeUsernameProblemLanguageResultExecution timeMemory
23777rubabredwanPalembang Bridges (APIO15_bridge)C++14
31 / 100
2000 ms15204 KiB
/*  Bismillahir Rahmanir Rahim  */

#include <bits/stdc++.h>

using namespace std;

const int N = 100005;
const long long oo = 1e18;

int k, n; 
long long pos[N][2];
char fk[N][2];

void solve_big(){
    long long ret = oo;
    for(int i = 1; i <= n; i++){
        for(int a = 0; a <= 1; a++){
            for(int j = 1; j <= n; j++){
                for(int b = 0; b <= 1; b++){
                    long long ans = 0;
                    for(int f = 1; f <= n; f++){
                        if(fk[f][0] == fk[f][1]){
                            ans += abs(pos[f][1] - pos[f][0]);
                            continue;
                        }
                        long long aa = 1LL + abs(pos[f][0] - pos[i][a]) + abs(pos[f][1] - pos[i][a]);
                        long long bb = 1LL + abs(pos[f][0] - pos[j][b]) + abs(pos[f][1] - pos[j][b]);
                        ans += min(aa, bb);
                    }
                    ret = min(ret, ans);
                }
            }
        }
    }
    cout << ret << endl;
}

void solve_small(){
	long long ret = oo;
	long long add = 0;
	long long pre = 0;
	long long suf = 0;
    vector<long long> gg;
    set<long long>ds;
	for(int i = 1; i <= n; ++i){
		if(fk[i][0] == fk[i][1]) add += abs(pos[i][1] - pos[i][0]);
		else{
			gg.push_back(pos[i][0]);
			gg.push_back(pos[i][1]);
            suf += pos[i][0];
            suf += pos[i][1];
            ++add;
        }
        ds.insert(pos[i][0]);
        ds.insert(pos[i][1]);
	}
	sort(gg.begin(), gg.end());
    if(gg.size() == 0) ret = 0;
    int ptr = 0;
    long long aa = 0, bb = gg.size();
    for(auto u : ds){

        while(ptr < gg.size() && gg[ptr] <= u){
            pre += gg[ptr];
            suf -= gg[ptr];
            ++aa;
            --bb;
            ++ptr;
        }

		long long ans = 0;

        ans += (u * aa) - pre;
        ans += suf - (u * bb);

        ret = min(ret, ans);
	}
	cout << ret + add << endl;
}

int main(){
    cin >> k >> n;
    for(int i = 1; i <= n; i++){
        for(int j = 0; j <= 1; j++){
            cin >> fk[i][j] >> pos[i][j];
        }
    }
    if(k == 1) solve_small();
    else solve_big();
    return 0;
}

Compilation message (stderr)

bridge.cpp: In function 'void solve_small()':
bridge.cpp:63:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         while(ptr < gg.size() && gg[ptr] <= 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...