結果
| 問題 |
No.702 中央値を求めよ LIMITED
|
| コンテスト | |
| ユーザー |
kakira9618
|
| 提出日時 | 2018-06-15 23:47:00 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 1,308 ms / 5,000 ms |
| コード長 | 2,035 bytes |
| コンパイル時間 | 1,922 ms |
| コンパイル使用メモリ | 159,468 KB |
| 実行使用メモリ | 22,912 KB |
| 最終ジャッジ日時 | 2024-11-22 22:10:23 |
| 合計ジャッジ時間 | 38,216 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 25 |
ソースコード
#include "bits/stdc++.h"
using namespace std;
#define pb push_back
#define mp make_pair
constexpr int INF = 1 << 29;
constexpr int MOD = 1000000007;
typedef long long ll;
typedef unsigned long long ull;
constexpr int dx[4] = {1, 0, -1, 0};
constexpr int dy[4] = {0, 1, 0, -1};
uint32_t x = 0, y = 1, z = 2, w = 3;
uint32_t generate() {
uint32_t t = (x^(x<<11));
x = y;
y = z;
z = w;
w = (w ^ (w >> 19)) ^ (t ^ (t >> 8));
return w;
}
// https://gist.github.com/xr0038/5248256
class easyHeap {
uint32_t numel;
vector<uint32_t> mem;
void up(uint32_t n) {
uint32_t m = (n+1)/2-1;
if (n==0) return;
if (mem[m]>=mem[n]) return;
swap(mem[m],mem[n]);
up(m);
}
void down(uint32_t m) {
uint32_t n1 = (m+1)*2-1;
uint32_t n2 = (m+1)*2;
if (n2 >= numel) n2 = n1;
if (n1 >= numel) return;
if (mem[m]>=mem[n1] && mem[m]>=mem[n2]) return;
if (mem[n1]>=mem[n2]) {
swap(mem[m],mem[n1]); down(n1);
} else {
swap(mem[m],mem[n2]); down(n2);
}
}
public:
easyHeap() : mem(5000002){
numel = 0;
}
void show() {
uint32_t sep = 1;
if (numel==0) {
std::cout << "{}" << std::endl;
return;
}
std::cout << "{";
for (uint32_t i=0; i<numel-1; ++i) {
std::cout << mem[i];
if (i+1==sep) {
std::cout << ";"; sep += 2*sep;
} else { std::cout << ","; }
}
std::cout << mem[numel-1] << "}" << std::endl;
}
void push(uint32_t n) {
mem[numel] = n;
numel++;
up(numel-1);
}
uint32_t pop() {
if (numel==0) return -1;
uint32_t val = mem[0];
mem[0] = mem[numel-1];
numel--;
down(0);
return val;
}
uint32_t size() {
return numel;
}
};
int main(void) {
ll seed; cin >> seed;
x = seed;
int n = 10000001;
easyHeap Q;
for (int i = 0; i < n; i++) {
uint32_t a = generate();
Q.push(a);
if (Q.size() > (n - 1) / 2 + 1) {
Q.pop();
}
}
cout << Q.pop() << endl;
return 0;
}
kakira9618