제출 #259372

#제출 시각아이디문제언어결과실행 시간메모리
259372shayan_pPalembang Bridges (APIO15_bridge)C++14
100 / 100
977 ms27764 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];

int pt;
set<int> All;
map<int, int> L, R;
int CL, CR;
ll ANS;
 
void restart(){
    pt = -inf;
    All.clear();
    ANS = 0;
    L.clear(), R.clear();
    CL = CR = 0;	
}
ll add(int f, int s){
    All.insert(f), All.insert(s);
    L[f]++, R[s]++;
    if(pt < f)
	ANS+= f - pt;
    if(s < pt)
	ANS+= pt - s;
    if(pt < f)
	CL++;
    if(s <= pt)
	CR++;
    while(true){
	auto it = All.upper_bound(pt);
	if(it == All.end())
	    break;
	int nw = *it;
	ll df = 1ll * (CR - CL) * (nw - pt);
	ll num = df + ANS;
	if(num < ANS){
	    ANS = num, pt = nw;
	    CR+= R[pt];
	    CL-= L[pt];
	}
	else{
	    break;
	}
    }
    return ANS * 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);
 
    if(n == 0)
	return cout << sig << endl, 0;
    
    restart();
    for(int i = 0; i < n; i++){
	sv[i + 1] = add(inp[i].F, inp[i].S);
    }
    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...