結果
| 問題 |
No.5001 排他的論理和でランニング
|
| ユーザー |
alpha_virginis
|
| 提出日時 | 2018-03-16 23:20:26 |
| 言語 | C++17(gcc12) (gcc 12.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 1,365 ms / 1,500 ms |
| コード長 | 2,486 bytes |
| コンパイル時間 | 1,820 ms |
| 実行使用メモリ | 7,424 KB |
| スコア | 52,428,748 |
| 最終ジャッジ日時 | 2020-03-12 19:38:16 |
|
ジャッジサーバーID (参考情報) |
judge6 / |
| 純コード判定しない問題か言語 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 50 |
ソースコード
#include <bits/stdc++.h>
using Int = int64_t;
using UInt = uint64_t;
using C = std::complex<double>;
#define rep(i, n) for(Int i = 0; i < (Int)(n); ++i)
#define guard(x) if( not (x) ) continue;
#ifndef LOCAL_
#define fprintf if( false ) fprintf
#endif
const double timeLimit = 1.2;
struct Timer {
static const uint64_t ClocksPerSecond = 2600000000;
bool valid;
uint64_t beginTime;
uint64_t rdtsc() {
uint64_t u, l;
__asm__ volatile ("rdtsc" : "=a" (l), "=d" (u)); return ((u << 32) | l);
}
void start() {
beginTime = rdtsc();
valid = true;
}
double getTime() {
uint64_t now = rdtsc();
return (double)(now - beginTime) / ClocksPerSecond;
}
void stop() {
valid = false;
}
} globalTimer;
struct Solver {
Int n, m;
std::vector<Int> xs;
void read() {
std::cin >> n >> m;
xs.clear();
xs.resize(n);
rep(i,n)
std::cin >> xs[i];
}
void gen(int seed) {
std::mt19937 mt(seed);
std::uniform_int_distribution<> distN(5,100000);
n = distN(mt);
std::uniform_int_distribution<> distM(1,n);
m = distM(mt);
std::uniform_int_distribution<> distX(1,1000000);
std::vector<bool> checked(1000001);
xs.clear();
rep(i,n) {
Int x;
do {
x = distX(mt);
} while( checked[x] );
xs.emplace_back(x);
}
}
std::vector<Int> ys,zs;
void solve() {
for(Int i = 0; i < m; ++i) {
ys.emplace_back(i);
}
for(Int i = m; i < n; ++i) {
zs.emplace_back(i);
}
Int v = 0;
for(Int i : ys) {
v ^= xs[i];
}
fprintf(stderr, "v=%ld\n", v);
std::mt19937 mt(314159);
for(Int iter = 0; ; ++iter) {
if( globalTimer.getTime() > timeLimit ) break;
std::uniform_int_distribution<> distI(0,m-1);
std::uniform_int_distribution<> distK(0,n-m-1);
Int i = distI(mt);
Int k = distK(mt);
Int nv = v ^ xs[ys[i]] ^ xs[zs[k]];
if( v < nv ) {
v = nv;
std::swap(ys[i], zs[k]);
fprintf(stderr, "nv = %ld\n", nv);
}
}
}
void write() {
printf("%ld", xs[ys[0]]);
for(Int i = 1; i < m; ++i) {
printf(" %ld", xs[ys[i]]);
}
putchar('\n');
}
};
int main() {
globalTimer.start();
Solver solver;
solver.read();
// solver.gen(2);
solver.solve();
solver.write();
}
alpha_virginis