Submission #20222

#TimeUsernameProblemLanguageResultExecution timeMemory
20222erdemkirazPalembang Bridges (APIO15_bridge)C++14
100 / 100
449 ms14064 KiB
#include "iostream" #include "algorithm" #include "vector" #include "set" #include "map" #include "cstring" #include "string" #include "vector" #include "cassert" #include "queue" #include "cstdio" #include "cstdlib" #include "ctime" #include "cmath" #include "bitset" using namespace std; typedef long long ll; typedef pair < int, int > ii; const int N = 1e5 + 5; int n, k; ll pre[N], suf[N]; class node{ public: int size; ll sum; multiset < int > s; void init() { size = 0; sum = 0; s.clear(); } int first() { return *s.begin(); } int second() { return *--s.end(); } int del(int x) { s.erase(s.find(x)); size--; sum -= x; return x; } void add(int x) { size++; sum += x; s.insert(x); } bool fit(int x) { return s.size() and x >= *s.begin(); } }s[2]; void update(int x) { //printf("x = %d\n", x); if(s[1].fit(x)) s[1].add(x); else s[0].add(x); if(s[0].size > s[1].size + 1) s[1].add(s[0].del(s[0].second())); if(s[1].size > s[0].size) s[0].add(s[1].del(s[1].first())); } ll get() { int p = s[0].second(); //printf("p = %d\n", p); return -s[0].sum + s[1].sum + (ll) (s[0].size - s[1].size) * p; } int main () { scanf("%d %d", &k, &n); ll add = 0; vector < ii > v; for(int i = 1; i <= n; i++) { char c1, c2; int x, y; scanf(" %c %d %c %d", &c1, &x, &c2, &y); if(c1 == c2) { add += abs(x - y); } else { if(x > y) swap(x, y); v.push_back({x, y}); } } sort(v.begin(), v.end(), [&](ii x, ii y){ return x.first + x.second < y.first + y.second; }); n = v.size(); add += n; for(int i = 1; i <= n; i++) { int x = v[i - 1].first, y = v[i - 1].second; update(x); update(y); pre[i] = get(); } s[0].init(); s[1].init(); for(int i = n; i >= 1; i--) { int x = v[i - 1].first, y = v[i - 1].second; update(x); update(y); suf[i] = get(); } // printf("pre[n] = %d add = %d\n", pre[n], add); if(k == 1) printf("%lld\n", pre[n] + add); else { ll ans = pre[n]; for(int i = 1; i < n; i++) { //printf("pre[%d] = %d suf[%d] = %d\n", i, pre[i], i + 1, suf[i + 1]); ans = min(ans, pre[i] + suf[i + 1]); } printf("%lld\n", ans + add); } return 0; }

Compilation message (stderr)

bridge.cpp: In function 'int main()':
bridge.cpp:78:27: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d %d", &k, &n);
                           ^
bridge.cpp:87:48: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf(" %c %d %c %d", &c1, &x, &c2, &y);
                                                ^
#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...