結果
| 問題 | No.122 傾向と対策:門松列(その3) | 
| コンテスト | |
| ユーザー |  | 
| 提出日時 | 2015-09-09 23:50:12 | 
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) | 
| 結果 | 
                                AC
                                 
                             | 
| 実行時間 | 1,457 ms / 5,000 ms | 
| コード長 | 2,203 bytes | 
| コンパイル時間 | 123 ms | 
| コンパイル使用メモリ | 12,544 KB | 
| 実行使用メモリ | 11,008 KB | 
| 最終ジャッジ日時 | 2024-07-19 05:08:59 | 
| 合計ジャッジ時間 | 4,990 ms | 
| ジャッジサーバーID (参考情報) | judge3 / judge5 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| other | AC * 8 | 
ソースコード
def read_data():
    minmaxs = []
    for i in range(7):
        min_i, max_i = map(int, input().split())
        minmaxs.append((min_i, max_i))
    return minmaxs
def solve(minmaxs):
    mod = 10**9 + 7
    minmaxs3 = (minmaxs[1], minmaxs[3], minmaxs[5])
    minmaxs4 = (minmaxs[0], minmaxs[2], minmaxs[4], minmaxs[6])
    count = 0
    for i, minmax in enumerate(minmaxs4):
        minmaxs3b = minmaxs4[:i] + minmaxs4[i + 1:]
        count += count_top_mid_bottom(minmaxs3, minmax, minmaxs3b, mod)
        count += count_top_mid_bottom(minmaxs3b, minmax, minmaxs3, mod)
    return count % mod
def count_top_mid_bottom(minmaxsA, minmax, minmaxsB, mod):
    count = 0
    for mid in range(minmax[0], minmax[1] + 1):
        top = count_top(minmaxsA, mid + 1, mod)
        if top == 0: continue
        bottom = count_bottom(minmaxsB, mid - 1, mod)
        count += top * bottom
    return count % mod
def count_top(minmaxs, lower, mod):
    for min_i, max_i in minmaxs:
        if max_i < lower: return 0
    minmaxs = [(max(lower, min_i), max_i) for min_i, max_i in minmaxs]
    return count_pattern(minmaxs, mod)
def count_bottom(minmaxs, upper, mod):
    for min_i, max_i in minmaxs:
        if min_i > upper: return 0
    minmaxs = [(min_i, min(upper, max_i)) for min_i, max_i in minmaxs]
    return count_pattern(minmaxs, mod)
def count_pattern(minmaxs, mod):
    widths = [max_i - min_i + 1 for min_i, max_i in minmaxs]
    count = widths[0] * widths[1] * widths[2]
    # 0, {1,2}
    lower = max(minmaxs[1][0], minmaxs[2][0])
    upper = min(minmaxs[1][1], minmaxs[2][1])
    if lower <= upper: count -= (upper - lower + 1) * widths[0]
    # 1, {0,2}
    lower = max(minmaxs[0][0], minmaxs[2][0])
    upper = min(minmaxs[0][1], minmaxs[2][1])
    if lower <= upper: count -= (upper - lower + 1) * widths[1]
    # 2, {0,1}
    lower = max(minmaxs[0][0], minmaxs[1][0])
    upper = min(minmaxs[0][1], minmaxs[1][1])
    if lower <= upper: count -= (upper - lower + 1) * widths[2]
    # {0,1,2}
    lower = max(lower, minmaxs[2][0])
    upper = min(upper, minmaxs[2][1])
    if lower <= upper: count += (upper - lower + 1) * 2
    return count % mod
minmaxs = read_data()
print(solve(minmaxs))
            
            
            
        