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
AC × 150
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