Submission #641594

#TimeUsernameProblemLanguageResultExecution timeMemory
641594QwertyPiPalembang Bridges (APIO15_bridge)C++14
100 / 100
245 ms15248 KiB
#include <bits/stdc++.h> #define int long long #define fi first #define se second using namespace std; struct Person{ int l, r; }; int f(int x, Person p){ if(x < p.l) return (p.l - x); if(x > p.r) return (x - p.r); return 0; } const int MAXN = 2e5 + 11; int xs[MAXN], d[MAXN], k; int ci(int x){ return lower_bound(xs, xs + k, x) - xs; } struct BIT{ int bit[MAXN + 3] = {0}, s = 0; void upd(int p, int v){ p += 2; for(int i = p; i <= MAXN; i += i & -i){ bit[i] += v; } s += v; } int qry(int p){ int ret = 0; p += 2; for(int i = p; i; i -= i & -i){ ret += bit[i]; } return ret; } int bs(){ int t = qry(MAXN); assert(t % 2 == 0); int idx = 0, val = 0; for(int j = 19; j >= 0; j--){ if(idx + (1 << j) <= MAXN && val + bit[idx + (1 << j)] <= t / 2 - 1){ val += bit[idx + (1 << j)]; idx += (1 << j); } } idx--; return idx; } }; struct DS{ BIT bit0, bit1; int rsum = 0; void upd(int p, int v, bool from_l){ bit0.upd(p, v); bit1.upd(p, v * xs[p]); rsum += v * (from_l ? xs[p] : 0); } int qry(){ int x = bit0.bs(); int t = bit0.qry(MAXN) / 2; int c = bit0.qry(x - 1); int lsum = bit1.qry(x - 1) + xs[x] * (t - c); return rsum - lsum; } } dsl, dsr; int32_t main() { int K, n; cin >> K >> n; vector<Person> P; int C = 0; for(int i = 0; i < n; i++){ char p, q; int s, t; cin >> p >> s >> q >> t; C += abs(s - t) + (p != q); if (p != q) { if(s > t) swap(s, t); P.push_back({s, t}); } } vector<int> x; for(auto p : P) { x.push_back(p.l); x.push_back(p.r); } x.push_back(0); sort(x.begin(), x.end()); x.resize(unique(x.begin(), x.end()) - x.begin()); for(auto& i : x){ i <<= 1; } for(auto& p : P){ p.l <<= 1, p.r <<= 1; } for(int i = 0; i < x.size(); i++){ xs[i] = x[i]; } for(int i = 0; i + 1 < x.size(); i++){ d[i] = xs[i + 1] - xs[i]; } int ans = 1LL << 60; k = x.size(); if (K == 1) { for(auto p : P){ dsl.upd(ci(p.l), 1, 1); dsl.upd(ci(p.r), 1, 0); } cout << C + dsl.qry() << endl; } else { if(k == 0){ cout << C << endl; return 0; } for(auto p : P){ dsr.upd(ci(p.l), 1, 1); dsr.upd(ci(p.r), 1, 0); } sort(P.begin(), P.end(), [](Person a, Person b){ return (a.l + a.r) / 2 < (b.l + b.r) / 2; }); int ans = dsl.qry() + dsr.qry(); for(int i = 0; i < P.size(); i++){ dsl.upd(ci(P[i].l), 1, 1); dsl.upd(ci(P[i].r), 1, 0); dsr.upd(ci(P[i].l), -1, 1); dsr.upd(ci(P[i].r), -1, 0); ans = min(ans, dsl.qry() + dsr.qry()); } cout << C + ans << endl; } }

Compilation message (stderr)

bridge.cpp: In function 'int32_t main()':
bridge.cpp:105:19: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  105 |  for(int i = 0; i < x.size(); i++){
      |                 ~~^~~~~~~~~~
bridge.cpp:109:23: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  109 |  for(int i = 0; i + 1 < x.size(); i++){
      |                 ~~~~~~^~~~~~~~~~
bridge.cpp:138:20: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<Person>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  138 |   for(int i = 0; i < P.size(); i++){
      |                  ~~^~~~~~~~~~
bridge.cpp:112:6: warning: unused variable 'ans' [-Wunused-variable]
  112 |  int ans = 1LL << 60;
      |      ^~~
#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...