Submission #259348

#TimeUsernameProblemLanguageResultExecution timeMemory
259348shayan_pPalembang Bridges (APIO15_bridge)C++14
8 / 100
2083 ms3560 KiB
// And you curse yourself for things you never done

#include<bits/stdc++.h>

#define F first
#define S second
#define PB push_back
#define sz(s) int((s).size())
#define bit(n,k) (((n)>>(k))&1)

using namespace std;

typedef long long ll;
typedef pair<int,int> pii;

const int maxn = 1e5 + 10, inf = 1e9 + 10;
const ll INF = 1e18;

ll sv[maxn];

vector<pii> vec;
int LST;
vector<int> arr;

void restart(){
    vec.clear();
    LST = -1;
}
ll calc(int pos){
    ll num = 0;
    for(pii p : vec){
	if(pos < p.F)
	    num+= p.F - pos;
	if(p.S < pos)
	    num+= pos - p.S;
    }
    return num;
}
ll add(int f, int s){
    vec.PB({f, s});
    int l = -1, r = sz(arr)-1;
    while(r-l > 1){
	int mid = (l + r) >> 1;
	if(calc(arr[mid]) > calc(arr[mid+1]))
	    l = mid;
	else
	    r = mid;	
    }
    assert(LST <= r);
    LST = r;
    return calc(arr[r]) * 2;

}


int main(){
    ios_base::sync_with_stdio(false); cin.tie(0); cout.tie();

    int k, n;
    cin >> k >> n;
    ll sig = 0;
    vector<pii> inp;
    for(int i = 0; i < n; i++){
	char a, b;
	int l, r;
	cin >> a >> l >> b >> r;
	if(r < l)
	    swap(l, r);
	sig+= r-l;
	if(a != b){
	    sig++;
	    inp.PB({l, r});
	}
    }
    sort(inp.begin(), inp.end(), [](pii a, pii b){ return a.F + a.S < b.F + b.S; } );
    n = sz(inp);

    for(int i = 0; i < n; i++){
	arr.PB(inp[i].F);
	arr.PB(inp[i].S);
    }
    
    sort(arr.begin(), arr.end());
    arr.resize( unique(arr.begin(), arr.end()) - arr.begin() );
    
    restart();
    for(int i = 0; i < n; i++){
	sv[i + 1] = add(inp[i].F, inp[i].S);
    }
    for(int i = 0; i < sz(arr); i++){
	arr[i]*=-1;
    }
    reverse(arr.begin(), arr.end());
    restart();    
    ll ans = INF;
    for(int i = n-1; i >= 0; i--){
	ans = min(ans, sig + sv[i] + add(-inp[i].S, -inp[i].F));
    }
    if(k == 1)
	ans = sig + sv[n];
    return cout << ans << endl, 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...