제출 #228979

#제출 시각아이디문제언어결과실행 시간메모리
228979alishahali1382Palembang Bridges (APIO15_bridge)C++14
100 / 100
84 ms9568 KiB
#include <bits/stdc++.h> #pragma GCC optimize ("O2") #pragma GCC optimize ("unroll-loops") //#pragma GCC optimize("no-stack-protector,fast-math") using namespace std; typedef long long ll; typedef long double ld; typedef pair<int, int> pii; typedef pair<pii, int> piii; typedef pair<ll, ll> pll; #define debug(x) cerr<<#x<<'='<<(x)<<endl; #define debugp(x) cerr<<#x<<"= {"<<(x.first)<<", "<<(x.second)<<"}"<<endl; #define debug2(x, y) cerr<<"{"<<#x<<", "<<#y<<"} = {"<<(x)<<", "<<(y)<<"}"<<endl; #define debugv(v) {cerr<<#v<<" : ";for (auto x:v) cerr<<x<<' ';cerr<<endl;} #define all(x) x.begin(), x.end() #define pb push_back #define kill(x) return cout<<x<<'\n', 0; const ld eps=1e-7; const int inf=1000000010; const ll INF=10000000000000010LL; const int mod=1000000007; const int MAXN=100010, LOG=20; ll n, m, k, u, v, x, y, t, l, r, ans, constant; pll A[MAXN]; ll B[MAXN], C[MAXN]; struct Solver{ priority_queue<ll> pref; priority_queue<ll, vector<ll>, greater<ll>> suff; ll pref_sum=0, suff_sum=0, mid=inf; void Add(ll x){ if (x<=mid) pref.push(x), pref_sum+=x; else suff.push(x), suff_sum+=x; while (pref.size()<suff.size()){ ll x=suff.top(); suff.pop(); suff_sum-=x; pref.push(x); pref_sum+=x; //cerr<<"move2 "<<x<<endl; } while (pref.size()-suff.size()>1){ ll x=pref.top(); pref.pop(); pref_sum-=x; suff.push(x); suff_sum+=x; //cerr<<"move1 "<<x<<endl; } mid=pref.top(); } ll Get(){ return suff_sum-suff.size()*mid + pref.size()*mid-pref_sum; } } S1, S2; int main(){ ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0); //freopen("input.txt", "r", stdin); //freopen("output.txt", "w", stdout); cin>>k>>m; //assert(m<=1000 && k==1); char c1, c2; while (m--){ cin>>c1>>l>>c2>>r; if (l>r) swap(l, r); if (c1!=c2){ A[++n]={l, r}; constant++; } else constant+=r-l; } sort(A+1, A+n+1, [](pll i, pll j){ return i.first+i.second<j.first+j.second; }); for (int i=1; i<=n; i++){ S1.Add(A[i].first); S1.Add(A[i].second); B[i]=S1.Get(); } for (int i=n; i; i--){ S2.Add(A[i].first); S2.Add(A[i].second); C[i]=S2.Get(); } ans=B[n]; if (k==2){ for (int i=1; i<n; i++) ans=min(ans, B[i]+C[i+1]); } //debug(ans) cout<<ans+constant<<'\n'; return 0; } /* 1 5 B 0 A 4 B 1 B 3 A 5 B 7 B 2 A 6 B 1 A 7 */
#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...