제출 #259368

#제출 시각아이디문제언어결과실행 시간메모리
259368shayan_pPalembang Bridges (APIO15_bridge)C++14
49 / 100
2086 ms2652 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 pt; set<int> All; ll ANS; void restart(){ vec.clear(); pt = -inf; All.clear(); ANS = INF; } 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){ All.insert(f), All.insert(s); vec.PB({f, s}); ANS = calc(pt); while(true){ auto it = All.upper_bound(pt); if(it == All.end()) break; int nw = *it; ll num = calc(nw); if(num < ANS) ANS = num, pt = nw; 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...