Submission #1079162

#TimeUsernameProblemLanguageResultExecution timeMemory
1079162MuhammetPalembang Bridges (APIO15_bridge)C++17
100 / 100
235 ms20292 KiB
#include <bits/stdc++.h> using namespace std; #define int long long #define sz(x) (int)x.size() #define ff first #define ss second const int N = 300005; const int M = 1e9 + 7; int T, n, k, s1[N], s2[N]; char c1[N], c2[N]; signed main(){ ios::sync_with_stdio(false); cin.tie(0); cin >> k >> n; for(int i = 1; i <= n; i++){ cin >> c1[i] >> s1[i] >> c2[i] >> s2[i]; } int ans = 0; if(k == 1){ vector <int> v; for(int i = 1; i <= n; i++){ if(c1[i] == c2[i]){ ans += abs(s1[i]-s2[i]); } else { v.push_back(s1[i]); v.push_back(s2[i]); } } sort(v.begin(), v.end()); int x = (sz(v)+1)/2; x--; if(x >= 0) x = v[x]; for(auto i : v){ ans += abs(i-x); } cout << ans+sz(v)/2 << "\n"; return 0; } vector <pair<int,pair<int,int>>> v1; for(int i = 1; i <= n; i++){ if(c1[i] != c2[i]){ v1.push_back({(s1[i]+s2[i])/2,{min(s1[i],s2[i]),max(s1[i],s2[i])}}); } else { ans += abs(s1[i]-s2[i]); } } ans += sz(v1); if(sz(v1) > 0){ sort(v1.begin(), v1.end()); } multiset <int> st1, st2; vector <int> p(sz(v1),0), f(sz(v1),0); int sm1 = 0, sm2 = 0; for(int j = 0; j < sz(v1); j++){ pair <int,pair<int,int>> i = v1[j]; st1.insert(i.ss.ff); st1.insert(i.ss.ss); sm1 += (i.ss.ff); sm1 += (i.ss.ss); st2.insert(*st1.rbegin()); sm2 += *st1.rbegin(); sm1 -= *(--st1.end()); st1.erase(--st1.end()); sm2 += *st1.rbegin(); st2.insert(*st1.rbegin()); sm1 -= *(--st1.end()); st1.erase(--st1.end()); sm1 += *st2.begin(); st1.insert(*st2.begin()); sm2 -= *(st2.begin()); st2.erase(st2.begin()); int med = (*st1.rbegin()); p[j] = (sz(st1)*med - sm1); p[j] += (sm2 - med*sz(st2)); } st1.clear(); st2.clear(); sm1 = sm2 = 0; for(int j = sz(v1)-1; j >= 0; j--){ pair <int,pair<int,int>> i = v1[j]; st1.insert(i.ss.ff); st1.insert(i.ss.ss); sm1 += (i.ss.ff); sm1 += (i.ss.ss); st2.insert(*st1.rbegin()); sm2 += *st1.rbegin(); sm1 -= *(--st1.end()); st1.erase(--st1.end()); sm2 += *st1.rbegin(); st2.insert(*st1.rbegin()); sm1 -= *(--st1.end()); st1.erase(--st1.end()); sm1 += *st2.begin(); st1.insert(*st2.begin()); sm2 -= *(st2.begin()); st2.erase(st2.begin()); int med = (*st1.rbegin()); f[j] = (sz(st1)*med - sm1); f[j] += (sm2 - med*sz(st2)); } int mn = 0; if(sz(v1) > 0) mn = min(p[sz(v1)-1],f[0]); for(int i = 0; i < sz(v1)-1; i++){ mn = min(mn,p[i]+f[i+1]); } cout << ans + mn << "\n"; return 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...