Submission #725317

#TimeUsernameProblemLanguageResultExecution timeMemory
725317quiet_spacePalembang Bridges (APIO15_bridge)C++14
100 / 100
88 ms5968 KiB
#include <bits/stdc++.h> #define FOR(i,j,k) for(int i=j; i<=k; ++i) #define ROF(i,j,k) for(int i=j; i>=k; --i) inline int read (void) { int x = 0, f = 1, ch = getchar(); while(!isdigit(ch)) { if(ch == '-') f = -f; ch = getchar(); } while(isdigit(ch)) { x = x * 10 + ch - '0'; ch = getchar(); } return x * f; } using ll = long long; using pii = std::pair <int, int>; const int maxn = 100005; inline bool cmp (pii p, pii q) { return p.first + p.second < q.first + q.second; } char chp[5], chq[5]; pii p[maxn]; int a[maxn<<1]; ll pre[maxn], suf[maxn]; struct Node1 { ll tot; std::priority_queue <int> q; inline int top (void) { return q.top(); } inline void push (int v) { tot += v; q.push(v); } inline void pop (void) { tot -= q.top(); q.pop(); } inline void clear (void) { tot = 0; while(!q.empty()) q.pop(); } } q1; struct Node2 { ll tot; std::priority_queue <int, std::vector <int>, std::greater <int> > q; inline int top (void) { return q.top(); } inline void push (int v) { tot += v; q.push(v); } inline void pop (void) { tot -= q.top(); q.pop(); } inline void clear (void) { tot = 0; while(!q.empty()) q.pop(); } } q2; int main (void) { int k = read(), N = read(), n = 0; ll ans = 0; FOR(i,1,N) { scanf("%s", chp+1); int s = read(); scanf("%s", chq+1); int t = read(); if(s > t) std::swap (s, t); if(chp[1] == chq[1]) ans += t - s; else { ++ ans; p[++ n] = {s, t}; } } if(k == 1) { FOR(i,1,n) a[i*2-1] = p[i].first, a[i*2] = p[i].second; std::sort(a+1, a+n*2+1); FOR(i,1,n) ans -= a[i]; FOR(i,n+1,n*2) ans += a[i]; } else { std::sort(p+1, p+n+1, cmp); ll mn = 1ll << 60; FOR(i,1,n) { q1.push(p[i].first); q2.push(p[i].second); while(q1.top() > q2.top()) { q2.push(q1.top()); q1.pop(); q1.push(q2.top()); q2.pop(); } pre[i] = q2.tot - q1.tot; } q1.clear (); q2.clear (); ROF(i,n,1) { q1.push(p[i].first); q2.push(p[i].second); while(q1.top() > q2.top()) { q2.push(q1.top()); q1.pop(); q1.push(q2.top()); q2.pop(); } suf[i] = q2.tot - q1.tot; } FOR(i,0,n) mn = std::min(mn, pre[i] + suf[i+1]); ans += mn; } printf("%lld\n", ans); return 0; }

Compilation message (stderr)

bridge.cpp: In function 'int main()':
bridge.cpp:38:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   38 |     scanf("%s", chp+1);
      |     ~~~~~^~~~~~~~~~~~~
bridge.cpp:40:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   40 |     scanf("%s", chq+1);
      |     ~~~~~^~~~~~~~~~~~~
#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...