結果
問題 | No.2835 Take and Flip |
ユーザー |
![]() |
提出日時 | 2024-08-09 21:30:51 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 136 ms / 2,000 ms |
コード長 | 2,834 bytes |
コンパイル時間 | 2,121 ms |
コンパイル使用メモリ | 198,292 KB |
最終ジャッジ日時 | 2025-02-23 21:24:15 |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 22 |
ソースコード
#include <bits/stdc++.h>using namespace std;template <class T>struct DEPQ {vector<T> d;void push(T x) {int k = d.size();d.push_back(x);up(k);}T get_max() {return d[0];}T get_min() {return (d.size() < 2 ? d[0] : d[1]);}void pop_max() {if (d.size() < 2) {d.pop_back();} else {swap(d[0], d.back());d.pop_back();int k = down(0);up(k);}}void pop_min() {if (d.size() < 3) {d.pop_back();} else {swap(d[1], d.back());d.pop_back();int k = down(1);up(k);}}int size() {return (int)d.size();}bool empty() {return (int)d.size() > 0;}int parent(int k) {int r = k % 4;return ((r == 2 || r == 3) ? (k - r) / 2 : (k - r) / 2 - 2);}void up(int k) {int mx = (k % 2 == 0 ? k : k - 1);int mn = (k % 2 == 0 ? k + 1 : k);if (mn < (int)d.size() && d[mx] < d[mn]) {swap(d[mx], d[mn]);k = (k % 2 == 0 ? k + 1 : k - 1);}int p;while (1 < k && d[p = parent(k)] < d[k]) {swap(d[p], d[k]);k = p;}while (1 < k && d[k] < d[p = parent(k) + 1]) {swap(d[p], d[k]);k = p;}}int down(int k) {int n = d.size();if (k % 2 == 1) {while (2 * k + 1 < n) {int c = 2 * k + 3;if (n <= c || d[c - 2] < d[c]) {c -= 2;}if (c < n && d[c] < d[k]) {swap(d[k], d[c]);k = c;} else {break;}}} else {while (2 * k + 2 < n) {int c = 2 * k + 4;if (n <= c || d[c] < d[c - 2]) {c -= 2;}if (c < n && d[k] < d[c]) {swap(d[k], d[c]);k = c;} else {break;}}}return k;}};using lint = long long;int main() {int n;cin >> n;DEPQ<lint> q;for (int i = 0; i < n; i++) {lint a;cin >> a;q.push(a);}lint x = 0, y = 0;for (int i = 0; i < n; i++) {if (i % 2 == 0) {lint t = q.get_max();q.pop_max();x += t;} else {lint t = q.get_min();q.pop_min();y += -t;}}cout << x - y << endl;}