Submission #4350742


Source Code Expand

#-*- coding:utf-8 -*-
import itertools

# だめプログラム
# 追加予定(上の方が優先度高)
# 係数が負になる項に各項を圧縮する
#   圧縮には係数の最大値が大きくならないように調整する
#   グラフのアイデアから行けそう?
# 正の係数の良い圧縮をApriori法などを利用して行う
# 次数が大きく係数が小さい場合には誤差を恐れず変換する(評価値次第)

def bool_2_function():
    # データ入力
    N, K, data = input_data()
    # 前処理を行う
    vp, vn, results = preprocessing(data)
    # 次元の削減を行う
    S = order_reductions(vp, vn, results, N)
    # 結果のマージ
    out = marge(results)
    # データ出力
    output_data(S, out)


def input_data():
    # 入力
    # N : 変数の総数, K : 項の数
    # data : [次数, 係数, 変数, ..., 変数]
    N, K = map(int, input().split())
    data = [list(map(int, input().split())) for _ in range(K)]
    return N, K, data


def output_data(S, results):
    # 出力
    # S : 変数の数, L : 項の数
    # results : 2次の整数疑似プール関数
    L = len(results)
    print(S, L)
    print('\n'.join([' '.join(map(str, i)) for i in results]))


def preprocessing(data):
    # データの前処理, 以下のように振り分ける
    # results : 係数が2以下, それ以外については
    # vp : 係数が正, vn : 係数が負
    results = []
    vp = []
    vn = []
    for row in data:
        if row[0] > 2:
            if row[1] > 0:
                vp.append(row)
            else:
                vn.append(row)
        else:
            results.append(row)
    return vp, vn, results


def order_reductions(vp, vn, results, S):
    # 次数の削減の処理の全体
    # 係数が正について
    for row in vp:
        # リストの反転[注意]
        row.reverse()
        while 1:
            if row[-1] < 3:
                row.reverse()
                results.append(row)
                break
            S += 1
            if row[-2] > 0:
                # とりあえず一番うしろ(プログラム上は前)のものを取り出す
                result = order_reduction_p(row, row[0], S)
            results.extend(result)
    # 係数が負について
    for row in vn:
        # リストの反転[注意]
        row.reverse()
        S += 1
        result = order_reduction_n(row, S)
        results.extend(result)
    return S


def order_reduction_p(row, vari, S):
    # 次元削減(係数が正の場合)
    row[-1] -= 1
    result = []
    coefficie = row[-2]
    row.remove(vari)
    for i in row[:-2]:
        result.append([2, -coefficie, i, S])
    result.append([2, coefficie, vari, S])
    result.append([1, coefficie * (row[-1] - 1), S])
    return result


def order_reduction_n(row, S):
    # 次元削減(係数が負の場合)
    result = []
    coefficie = row[-2]
    for i in row[:-2]:
        result.append([2, coefficie, i, S])
    result.append([1, -coefficie * (row[-1] - 1), S])
    return result


def marge(results):
    # 結果のマージ
    # 修正予定
    rem = []
    for i, row1 in enumerate(results):
        for j, row2 in enumerate(results):
            if i < j and row1[2:] == row2[2:]:
                row1[1] += row2[1] 
                rem.append(j)
    dellist = lambda items, indexes: [item for index, item in enumerate(items) if index not in indexes]
    out_results = dellist(results, rem)
    return out_results
    # for row1, row2 in itertools.combinations(results[:], 2):
    #     if row1[2:] == row2[2:]:
    #         row1[1] += row2[1]
    #         results.remove(row2)
    #     print(results)
    #         rows.append(row2)
    # for row in rows:
    #     results.remove(row)

if __name__ == '__main__' :
    bool_2_function()

Submission Info

Submission Time
Task B - Problem Setting B
User kalpa
Language Python (3.4.3)
Score 253922084
Code Size 3977 Byte
Status AC
Exec Time 26143 ms
Memory 6140 KiB

Judge Result

Set Name All
Score / Max Score 253922084 / 100
Status
AC × 15
Set Name Test Cases
All 01_pretest_00, 01_pretest_01, 01_pretest_02, 01_pretest_03, 01_pretest_04, 01_pretest_05, 01_pretest_06, 01_pretest_07, 01_pretest_08, 01_pretest_09, 01_pretest_10, 01_pretest_11, 01_pretest_12, 01_pretest_13, 01_pretest_14
Case Name Status Exec Time Memory
01_pretest_00 AC 2035 ms 3876 KiB
01_pretest_01 AC 3054 ms 4084 KiB
01_pretest_02 AC 204 ms 3316 KiB
01_pretest_03 AC 19 ms 3192 KiB
01_pretest_04 AC 6998 ms 4596 KiB
01_pretest_05 AC 2660 ms 3956 KiB
01_pretest_06 AC 4127 ms 4212 KiB
01_pretest_07 AC 2484 ms 3956 KiB
01_pretest_08 AC 190 ms 3316 KiB
01_pretest_09 AC 1222 ms 3700 KiB
01_pretest_10 AC 35 ms 3192 KiB
01_pretest_11 AC 4452 ms 4388 KiB
01_pretest_12 AC 626 ms 3468 KiB
01_pretest_13 AC 26143 ms 6140 KiB
01_pretest_14 AC 3832 ms 4212 KiB