제출 #748187

#제출 시각아이디문제언어결과실행 시간메모리
748187MinaRagy06Swap Swap Sort (CCO21_day1problem1)C++17
11 / 25
5046 ms170104 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace std; using namespace __gnu_pbds; typedef int64_t ll; tree<pair<int, int>, null_type, less<pair<int, int>>, rb_tree_tag, tree_order_statistics_node_update> invs; set<pair<int, int>> s; vector<pair<int, int>> pairs; vector<pair<int, int>> check[100'005]; int val[2'000'005], q[1'000'005], a[100'005], p[100'005]; vector<int> frq[100'005]; const int BUF_SZ = 1 << 15; inline namespace Input { char buf[BUF_SZ]; int pos; int len; char next_char() { if (pos == len) { pos = 0; len = (int)fread(buf, 1, BUF_SZ, stdin); if (!len) { return EOF; } } return buf[pos++]; } int read_int() { int x; char ch; int sgn = 1; while (!isdigit(ch = next_char())) { if (ch == '-') { sgn *= -1; } } x = ch - '0'; while (isdigit(ch = next_char())) { x = x * 10 + (ch - '0'); } return x * sgn; } } inline namespace Output { char buf[BUF_SZ]; int pos; void flush_out() { fwrite(buf, 1, pos, stdout); pos = 0; } void write_char(char c) { if (pos == BUF_SZ) { flush_out(); } buf[pos++] = c; } void write_int(int x) { static char num_buf[100]; if (x < 0) { write_char('-'); x *= -1; } int len = 0; for (; x >= 10; x /= 10) { num_buf[len++] = (char)('0' + (x % 10)); } write_char((char)('0' + x)); while (len) { write_char(num_buf[--len]); } write_char('\n'); } void write_ll(ll x) { static char num_buf[100]; if (x < 0) { write_char('-'); x *= -1; } int len = 0; for (; x >= 10; x /= 10) { num_buf[len++] = (char)('0' + (x % 10)); } write_char((char)('0' + x)); while (len) { write_char(num_buf[--len]); } write_char('\n'); } void init_output() { assert(atexit(flush_out) == 0); } } int main() { init_output(); int n = read_int(), k = read_int(), m = read_int(); for (int i = 0; i < k; i++) { p[i] = i + 1; } ll ans = 0; for (int i = 0; i < n; i++) { a[i] = read_int(); frq[a[i]].push_back(i); ans += invs.size() - invs.order_of_key({a[i] + 1, 0}); invs.insert({a[i], i}); } for (int i = 0; i < m; i++) { q[i] = read_int(); q[i]--; s.insert({p[q[i]], p[q[i] + 1]}); swap(p[q[i]], p[q[i] + 1]); s.insert({p[q[i]], p[q[i] + 1]}); } for (auto i : s) pairs.push_back(i); for (int i = 0; i < pairs.size(); i++) { check[pairs[i].first].push_back({pairs[i].second, i}); } assert(pairs.size() <= 2'000'005); for (int i = 1; i <= k; i++) { for (auto &[j, idx] : check[i]) { if (frq[i].empty() || frq[j].empty()) continue; if (frq[i].size() <= frq[j].size()) { int prv = 0; for (auto l : frq[i]) { val[idx] += frq[j].size() - (prv = lower_bound(frq[j].begin() + prv, frq[j].end(), l) - frq[j].begin()); } } else { int prv = 0; for (auto l : frq[j]) { val[idx] += (prv = lower_bound(frq[i].begin() + prv, frq[i].end(), l) - frq[i].begin()); } } } } for (int i = 0; i < k; i++) { p[i] = i + 1; } for (int i = 0; i < m; i++) { ans += val[lower_bound(pairs.begin(), pairs.end(), make_pair(p[q[i]], p[q[i] + 1])) - pairs.begin()]; swap(p[q[i]], p[q[i] + 1]); ans -= val[lower_bound(pairs.begin(), pairs.end(), make_pair(p[q[i]], p[q[i] + 1])) - pairs.begin()]; write_ll(ans); } return 0; }

컴파일 시 표준 에러 (stderr) 메시지

Main.cpp: In function 'int main()':
Main.cpp:107:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  107 |     for (int i = 0; i < pairs.size(); i++) {
      |                     ~~^~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...