Submission #69284174
Source Code Expand
import bisect, heapq, sys, math, copy, itertools, decimal
from collections import defaultdict, deque
import pprint
import random
random.seed(1234)
sys.setrecursionlimit(10**7)
def INT(): return int(input())
def MI(d=0): return map(lambda x:int(x)+d, input().split())
def MS(): return map(str, input().split())
def LI(d=0): return list(map(lambda x:int(x)+d, input().split()))
def LS(): return list(map(str, input().split()))
def pr_line(itr): print(*itr, sep='\n')
def pr_mtx(matrix): [print(*row) for row in matrix]
def pr_mtx2(matrix, l=2):
for row in matrix:
for x in row:
print(str(x).rjust(l), end='')
print('\n')
def pr_stderr(*s): print(*s, file=sys.stderr)
dij = [[1, 0], [0, 1], [-1, 0], [0, -1]]
dij2 = [[1, 0], [0, 1], [-1, 0], [0, -1], [1, 1], [1, -1], [-1, 1], [-1, -1]]
INF = float('inf')
from time import time
base_ms = 0
def tic():
global base_ms
base_ms = time()
def toc():
now = time()
return (now - base_ms) * 1000
###########################################################
def log_uniform(low, high, base=10):
log_low = math.log(low, base)
log_high = math.log(high, base)
r = random.uniform(log_low, log_high)
return int(base ** r)
N, M, L, U = MI()
A = [10**15 - 2*10**12]*50 + [random.randint(8*10**9, 5*10**11) for _ in range(N-M)]
# A = [10**15 - 2*10**12]*50 + \
# [random.randint(10**11, 10**12) for _ in range(350)] + \
# [random.randint(10**9, 10**10) for _ in range(100)]
print(*A)
B = LI()
def init_sol():
S = [0]*M
X = [0]*N
cards = sorted(enumerate(A), key=lambda x: -x[1])
for idx, val in cards:
best_increase = None
best_j = 0
for j in range(M):
old_cost = abs(S[j]-B[j])
new_cost = abs(S[j]+val-B[j])
increase = new_cost - old_cost
if best_increase is None or increase < best_increase:
best_increase = increase
best_j = j+1
if best_increase > 0 and random.random() < 0.2:
X[idx] = 0
else:
X[idx] = best_j
S[best_j-1] += val
return X, S
def cost(S, B):
return sum(abs(S[i]-B[i]) for i in range(M))
def annealing(X, S):
def multi_update(idxs, new_groups, cur_X, cur_S, cur_cost):
changed = []
new_cost = cur_cost
for idx, new_group in zip(idxs, new_groups):
old_group = cur_X[idx]
if new_group == old_group:
continue
val = A[idx]
# old_group の更新
if old_group != 0:
j = old_group - 1
new_cost -= abs(cur_S[j] - B[j])
cur_S[j] -= val
new_cost += abs(cur_S[j] - B[j])
# new_group の更新
if new_group != 0:
j = new_group - 1
new_cost -= abs(cur_S[j] - B[j])
cur_S[j] += val
new_cost += abs(cur_S[j] - B[j])
# 差分記録
changed.append((idx, old_group, new_group, val))
return new_cost, cur_S, changed
best_X = X[:]
best_S = S[:]
best_cost = cost(S, B)
cur_X = X[:]
cur_S = S[:]
cur_cost = best_cost
start_time = time()
TIME_LIMIT = 1.7
T0 = 1000
T_end = 1e-2
iters = 0
adapted = 0
while time() - start_time < TIME_LIMIT:
iters += 1
progress = (time()-start_time) / TIME_LIMIT
T = T0 * (T_end / T0) ** progress
k = 2
idxs = random.sample(range(N), k)
new_groups = [random.randint(0, M) for _ in range(len(idxs))]
new_cost, cur_S, changed = multi_update(idxs, new_groups, cur_X, cur_S, cur_cost)
if not changed:
continue
diff = new_cost - cur_cost
if diff < 0 or random.random() < math.exp(-diff / T):
adapted += 1
for idx, old_g, new_g, _ in changed:
cur_X[idx] = new_g
cur_cost = new_cost
if new_cost < best_cost:
best_cost = new_cost
best_X = cur_X[:]
best_S = cur_S[:]
else:
for idx, old_g, new_g, val in changed:
if new_g != 0:
j = new_g - 1
cur_S[j] -= val
if old_g != 0:
j = old_g - 1
cur_S[j] += val
cur_cost = cur_cost
#pr_stderr(best_cost)
pr_stderr(iters, adapted, best_cost)
return best_X, best_S, best_cost
X, S = init_sol()
X, S, cost = annealing(X, S)
un_use = []
d = defaultdict(int)
for i, x in enumerate(X):
if x == 0:
un_use.append(len(str(A[i])))
d[len(str(A[i]))] += 1
pr_stderr(*un_use)
pr_stderr(d)
print(*X)
Submission Info
| Submission Time | |
|---|---|
| Task | A - Random Sum Game |
| User | BenKenobi |
| Language | Python (PyPy 3.10-v7.3.12) |
| Score | 61971035442 |
| Code Size | 4988 Byte |
| Status | AC |
| Exec Time | 1965 ms |
| Memory | 113996 KiB |
Judge Result
| Set Name | test_ALL | ||
|---|---|---|---|
| Score / Max Score | 61971035442 / 150000000000 | ||
| Status |
|
| Set Name | Test Cases |
|---|---|
| test_ALL | test_0000.txt, test_0001.txt, test_0002.txt, test_0003.txt, test_0004.txt, test_0005.txt, test_0006.txt, test_0007.txt, test_0008.txt, test_0009.txt, test_0010.txt, test_0011.txt, test_0012.txt, test_0013.txt, test_0014.txt, test_0015.txt, test_0016.txt, test_0017.txt, test_0018.txt, test_0019.txt, test_0020.txt, test_0021.txt, test_0022.txt, test_0023.txt, test_0024.txt, test_0025.txt, test_0026.txt, test_0027.txt, test_0028.txt, test_0029.txt, test_0030.txt, test_0031.txt, test_0032.txt, test_0033.txt, test_0034.txt, test_0035.txt, test_0036.txt, test_0037.txt, test_0038.txt, test_0039.txt, test_0040.txt, test_0041.txt, test_0042.txt, test_0043.txt, test_0044.txt, test_0045.txt, test_0046.txt, test_0047.txt, test_0048.txt, test_0049.txt, test_0050.txt, test_0051.txt, test_0052.txt, test_0053.txt, test_0054.txt, test_0055.txt, test_0056.txt, test_0057.txt, test_0058.txt, test_0059.txt, test_0060.txt, test_0061.txt, test_0062.txt, test_0063.txt, test_0064.txt, test_0065.txt, test_0066.txt, test_0067.txt, test_0068.txt, test_0069.txt, test_0070.txt, test_0071.txt, test_0072.txt, test_0073.txt, test_0074.txt, test_0075.txt, test_0076.txt, test_0077.txt, test_0078.txt, test_0079.txt, test_0080.txt, test_0081.txt, test_0082.txt, test_0083.txt, test_0084.txt, test_0085.txt, test_0086.txt, test_0087.txt, test_0088.txt, test_0089.txt, test_0090.txt, test_0091.txt, test_0092.txt, test_0093.txt, test_0094.txt, test_0095.txt, test_0096.txt, test_0097.txt, test_0098.txt, test_0099.txt, test_0100.txt, test_0101.txt, test_0102.txt, test_0103.txt, test_0104.txt, test_0105.txt, test_0106.txt, test_0107.txt, test_0108.txt, test_0109.txt, test_0110.txt, test_0111.txt, test_0112.txt, test_0113.txt, test_0114.txt, test_0115.txt, test_0116.txt, test_0117.txt, test_0118.txt, test_0119.txt, test_0120.txt, test_0121.txt, test_0122.txt, test_0123.txt, test_0124.txt, test_0125.txt, test_0126.txt, test_0127.txt, test_0128.txt, test_0129.txt, test_0130.txt, test_0131.txt, test_0132.txt, test_0133.txt, test_0134.txt, test_0135.txt, test_0136.txt, test_0137.txt, test_0138.txt, test_0139.txt, test_0140.txt, test_0141.txt, test_0142.txt, test_0143.txt, test_0144.txt, test_0145.txt, test_0146.txt, test_0147.txt, test_0148.txt, test_0149.txt |
| Case Name | Status | Exec Time | Memory |
|---|---|---|---|
| test_0000.txt | AC | 1961 ms | 110624 KiB |
| test_0001.txt | AC | 1955 ms | 110376 KiB |
| test_0002.txt | AC | 1962 ms | 110596 KiB |
| test_0003.txt | AC | 1959 ms | 111428 KiB |
| test_0004.txt | AC | 1965 ms | 110444 KiB |
| test_0005.txt | AC | 1963 ms | 110120 KiB |
| test_0006.txt | AC | 1960 ms | 110724 KiB |
| test_0007.txt | AC | 1957 ms | 109412 KiB |
| test_0008.txt | AC | 1961 ms | 111128 KiB |
| test_0009.txt | AC | 1960 ms | 110396 KiB |
| test_0010.txt | AC | 1958 ms | 109780 KiB |
| test_0011.txt | AC | 1961 ms | 109780 KiB |
| test_0012.txt | AC | 1963 ms | 112148 KiB |
| test_0013.txt | AC | 1959 ms | 109920 KiB |
| test_0014.txt | AC | 1957 ms | 109532 KiB |
| test_0015.txt | AC | 1961 ms | 109044 KiB |
| test_0016.txt | AC | 1959 ms | 109020 KiB |
| test_0017.txt | AC | 1959 ms | 112716 KiB |
| test_0018.txt | AC | 1963 ms | 109948 KiB |
| test_0019.txt | AC | 1959 ms | 110344 KiB |
| test_0020.txt | AC | 1961 ms | 110744 KiB |
| test_0021.txt | AC | 1954 ms | 108564 KiB |
| test_0022.txt | AC | 1961 ms | 111704 KiB |
| test_0023.txt | AC | 1958 ms | 110548 KiB |
| test_0024.txt | AC | 1960 ms | 110256 KiB |
| test_0025.txt | AC | 1964 ms | 109876 KiB |
| test_0026.txt | AC | 1964 ms | 112088 KiB |
| test_0027.txt | AC | 1961 ms | 112440 KiB |
| test_0028.txt | AC | 1960 ms | 110968 KiB |
| test_0029.txt | AC | 1959 ms | 108548 KiB |
| test_0030.txt | AC | 1959 ms | 113092 KiB |
| test_0031.txt | AC | 1955 ms | 111312 KiB |
| test_0032.txt | AC | 1960 ms | 110444 KiB |
| test_0033.txt | AC | 1955 ms | 112012 KiB |
| test_0034.txt | AC | 1954 ms | 110612 KiB |
| test_0035.txt | AC | 1960 ms | 110088 KiB |
| test_0036.txt | AC | 1957 ms | 111772 KiB |
| test_0037.txt | AC | 1960 ms | 109036 KiB |
| test_0038.txt | AC | 1957 ms | 111684 KiB |
| test_0039.txt | AC | 1960 ms | 108828 KiB |
| test_0040.txt | AC | 1959 ms | 113172 KiB |
| test_0041.txt | AC | 1957 ms | 112368 KiB |
| test_0042.txt | AC | 1963 ms | 110900 KiB |
| test_0043.txt | AC | 1960 ms | 110676 KiB |
| test_0044.txt | AC | 1957 ms | 109404 KiB |
| test_0045.txt | AC | 1956 ms | 111252 KiB |
| test_0046.txt | AC | 1961 ms | 110328 KiB |
| test_0047.txt | AC | 1958 ms | 110696 KiB |
| test_0048.txt | AC | 1957 ms | 110912 KiB |
| test_0049.txt | AC | 1960 ms | 109824 KiB |
| test_0050.txt | AC | 1962 ms | 113896 KiB |
| test_0051.txt | AC | 1959 ms | 111948 KiB |
| test_0052.txt | AC | 1958 ms | 111056 KiB |
| test_0053.txt | AC | 1962 ms | 109360 KiB |
| test_0054.txt | AC | 1959 ms | 110328 KiB |
| test_0055.txt | AC | 1961 ms | 111088 KiB |
| test_0056.txt | AC | 1957 ms | 109064 KiB |
| test_0057.txt | AC | 1958 ms | 110380 KiB |
| test_0058.txt | AC | 1957 ms | 110956 KiB |
| test_0059.txt | AC | 1956 ms | 109640 KiB |
| test_0060.txt | AC | 1961 ms | 111640 KiB |
| test_0061.txt | AC | 1958 ms | 111732 KiB |
| test_0062.txt | AC | 1958 ms | 111056 KiB |
| test_0063.txt | AC | 1958 ms | 110596 KiB |
| test_0064.txt | AC | 1958 ms | 111280 KiB |
| test_0065.txt | AC | 1960 ms | 112736 KiB |
| test_0066.txt | AC | 1954 ms | 111516 KiB |
| test_0067.txt | AC | 1961 ms | 110784 KiB |
| test_0068.txt | AC | 1957 ms | 110076 KiB |
| test_0069.txt | AC | 1957 ms | 111764 KiB |
| test_0070.txt | AC | 1961 ms | 112320 KiB |
| test_0071.txt | AC | 1954 ms | 111528 KiB |
| test_0072.txt | AC | 1959 ms | 113704 KiB |
| test_0073.txt | AC | 1959 ms | 112624 KiB |
| test_0074.txt | AC | 1954 ms | 109712 KiB |
| test_0075.txt | AC | 1960 ms | 109672 KiB |
| test_0076.txt | AC | 1958 ms | 111088 KiB |
| test_0077.txt | AC | 1957 ms | 111340 KiB |
| test_0078.txt | AC | 1958 ms | 112236 KiB |
| test_0079.txt | AC | 1959 ms | 110200 KiB |
| test_0080.txt | AC | 1957 ms | 110692 KiB |
| test_0081.txt | AC | 1961 ms | 110284 KiB |
| test_0082.txt | AC | 1958 ms | 111020 KiB |
| test_0083.txt | AC | 1958 ms | 112212 KiB |
| test_0084.txt | AC | 1961 ms | 109460 KiB |
| test_0085.txt | AC | 1958 ms | 109804 KiB |
| test_0086.txt | AC | 1957 ms | 112960 KiB |
| test_0087.txt | AC | 1956 ms | 111808 KiB |
| test_0088.txt | AC | 1958 ms | 110584 KiB |
| test_0089.txt | AC | 1956 ms | 110980 KiB |
| test_0090.txt | AC | 1955 ms | 110136 KiB |
| test_0091.txt | AC | 1959 ms | 112740 KiB |
| test_0092.txt | AC | 1962 ms | 110112 KiB |
| test_0093.txt | AC | 1959 ms | 110084 KiB |
| test_0094.txt | AC | 1956 ms | 111252 KiB |
| test_0095.txt | AC | 1957 ms | 108592 KiB |
| test_0096.txt | AC | 1959 ms | 110816 KiB |
| test_0097.txt | AC | 1959 ms | 111904 KiB |
| test_0098.txt | AC | 1963 ms | 110404 KiB |
| test_0099.txt | AC | 1958 ms | 110952 KiB |
| test_0100.txt | AC | 1959 ms | 108444 KiB |
| test_0101.txt | AC | 1960 ms | 109692 KiB |
| test_0102.txt | AC | 1964 ms | 111900 KiB |
| test_0103.txt | AC | 1958 ms | 108780 KiB |
| test_0104.txt | AC | 1957 ms | 110092 KiB |
| test_0105.txt | AC | 1959 ms | 110940 KiB |
| test_0106.txt | AC | 1955 ms | 109984 KiB |
| test_0107.txt | AC | 1957 ms | 110632 KiB |
| test_0108.txt | AC | 1956 ms | 113080 KiB |
| test_0109.txt | AC | 1955 ms | 110676 KiB |
| test_0110.txt | AC | 1960 ms | 111428 KiB |
| test_0111.txt | AC | 1958 ms | 111272 KiB |
| test_0112.txt | AC | 1958 ms | 111172 KiB |
| test_0113.txt | AC | 1956 ms | 108536 KiB |
| test_0114.txt | AC | 1955 ms | 112988 KiB |
| test_0115.txt | AC | 1961 ms | 110536 KiB |
| test_0116.txt | AC | 1953 ms | 111036 KiB |
| test_0117.txt | AC | 1957 ms | 110008 KiB |
| test_0118.txt | AC | 1958 ms | 110336 KiB |
| test_0119.txt | AC | 1961 ms | 111248 KiB |
| test_0120.txt | AC | 1961 ms | 110108 KiB |
| test_0121.txt | AC | 1955 ms | 110724 KiB |
| test_0122.txt | AC | 1958 ms | 110808 KiB |
| test_0123.txt | AC | 1959 ms | 110880 KiB |
| test_0124.txt | AC | 1961 ms | 108748 KiB |
| test_0125.txt | AC | 1961 ms | 109680 KiB |
| test_0126.txt | AC | 1963 ms | 110624 KiB |
| test_0127.txt | AC | 1956 ms | 110136 KiB |
| test_0128.txt | AC | 1954 ms | 111360 KiB |
| test_0129.txt | AC | 1959 ms | 112524 KiB |
| test_0130.txt | AC | 1957 ms | 111580 KiB |
| test_0131.txt | AC | 1959 ms | 109996 KiB |
| test_0132.txt | AC | 1954 ms | 110740 KiB |
| test_0133.txt | AC | 1962 ms | 111132 KiB |
| test_0134.txt | AC | 1960 ms | 110888 KiB |
| test_0135.txt | AC | 1958 ms | 110140 KiB |
| test_0136.txt | AC | 1957 ms | 109776 KiB |
| test_0137.txt | AC | 1960 ms | 109988 KiB |
| test_0138.txt | AC | 1962 ms | 109900 KiB |
| test_0139.txt | AC | 1957 ms | 109636 KiB |
| test_0140.txt | AC | 1961 ms | 112188 KiB |
| test_0141.txt | AC | 1959 ms | 113996 KiB |
| test_0142.txt | AC | 1957 ms | 110320 KiB |
| test_0143.txt | AC | 1963 ms | 111372 KiB |
| test_0144.txt | AC | 1959 ms | 109624 KiB |
| test_0145.txt | AC | 1961 ms | 110420 KiB |
| test_0146.txt | AC | 1958 ms | 110736 KiB |
| test_0147.txt | AC | 1962 ms | 111892 KiB |
| test_0148.txt | AC | 1961 ms | 109904 KiB |
| test_0149.txt | AC | 1959 ms | 109544 KiB |