結果
| 問題 |
No.5001 排他的論理和でランニング
|
| ユーザー |
|
| 提出日時 | 2025-04-27 12:27:11 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 1,424 ms / 1,500 ms |
| コード長 | 2,987 bytes |
| コンパイル時間 | 542 ms |
| コンパイル使用メモリ | 82,296 KB |
| 実行使用メモリ | 194,540 KB |
| スコア | 52,428,749 |
| 最終ジャッジ日時 | 2025-04-27 12:27:44 |
| 合計ジャッジ時間 | 30,485 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
| 純コード判定しない問題か言語 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 50 |
ソースコード
import random
from time import perf_counter
import argparse
import sys
random.seed(0)
class TimeKeeper:
def __init__(self):
self.start_time = perf_counter()
def is_time_over(self, LIMIT):
return (perf_counter() - self.start_time) >= LIMIT
def time_now(self):
return (perf_counter() - self.start_time)
class XorSet:
def __init__(self, initial):
self.data = list(initial)
self.pos = {v:i for i,v in enumerate(self.data)}
self.current_xor = 0
for v in self.data:
self.current_xor ^= v
def __len__(self):
return len(self.data)
def random_element(self):
return random.choice(self.data)
# idx = random.randrange(len(self.data))
# return self.data[idx]
def remove(self, v):
idx = self.pos[v]
last = self.data[-1]
self.data[idx] = last
self.pos[last] = idx
self.data.pop()
del self.pos[v]
self.current_xor ^= v
def add(self, v):
self.pos[v] = len(self.data)
self.data.append(v)
self.current_xor ^= v
def random_restart_hill_climbing(values, M, tk, LIMIT, no_improve_limit=1000):
best_xor = -1
best_data = None
restart_count = 0
# グローバルタイム管理の下で複数回ヒルクライミング
while not tk.is_time_over(LIMIT):
restart_count += 1
# ランダム初期化
random.shuffle(values)
Sa = XorSet(values[:M])
Sb = XorSet(values[M:])
current_xor = Sa.current_xor
no_improve = 0
last_improve = 0
# 局所探索
while no_improve < no_improve_limit and not tk.is_time_over(LIMIT):
a_val = Sa.random_element()
b_val = Sb.random_element()
new_xor = current_xor ^ a_val ^ b_val
if new_xor > current_xor:
Sa.remove(a_val)
Sb.remove(b_val)
Sa.add(b_val)
Sb.add(a_val)
current_xor = new_xor
last_improve = no_improve
no_improve = 0
else:
no_improve += 1
# 局所解比較
if current_xor > best_xor:
best_xor = current_xor
best_data = list(Sa.data)
print(f"Restart {restart_count}: new best_xor = {best_xor} {last_improve=}", file=sys.stderr)
if best_xor == 1048575:
break
return best_data, best_xor
def main(DEBUG):
parser = argparse.ArgumentParser()
parser.add_argument('--debug', action='store_true')
args = parser.parse_args()
tk = TimeKeeper()
LIMIT = 1.3
N, M = map(int, input().split())
A = list(map(int, input().split()))
best_data, best = random_restart_hill_climbing(A, M, tk, LIMIT, no_improve_limit=100000)
# 出力
print(*best_data)
print("SC", best, tk.time_now(), file=sys.stderr)
if __name__ == '__main__':
main(False)