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 |
|
| 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 |