結果
問題 | No.335 門松宝くじ |
ユーザー | soupesuteaka |
提出日時 | 2016-02-25 08:30:42 |
言語 | Python3 (3.12.2 + numpy 1.26.4 + scipy 1.12.0) |
結果 |
TLE
|
実行時間 | - |
コード長 | 2,647 bytes |
コンパイル時間 | 98 ms |
コンパイル使用メモリ | 13,056 KB |
実行使用メモリ | 18,336 KB |
最終ジャッジ日時 | 2024-09-22 13:39:21 |
合計ジャッジ時間 | 3,784 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 32 ms
18,332 KB |
testcase_01 | AC | 31 ms
11,392 KB |
testcase_02 | AC | 32 ms
11,264 KB |
testcase_03 | AC | 31 ms
11,264 KB |
testcase_04 | AC | 31 ms
11,264 KB |
testcase_05 | TLE | - |
testcase_06 | -- | - |
testcase_07 | -- | - |
testcase_08 | -- | - |
testcase_09 | -- | - |
testcase_10 | -- | - |
testcase_11 | -- | - |
testcase_12 | -- | - |
testcase_13 | -- | - |
ソースコード
import sys import re import itertools """ defs """ class SegTree_Min: def __init__(self, n): self.n = 1 while (self.n < n): self.n <<= 1 self.dat = [float('inf')] * (2*self.n-1) def update(self, x, k): k += self.n - 1 self.dat[k] = x while(k > 0): if (self.dat[(k-1)//2] > self.dat[k]): self.dat[(k-1)//2] = self.dat[k] k = (k-1) // 2 def query_rec(self, a, b, k, l, r): if (b <= l or r <= a): return float('inf') if (a<=l and r <= b): return self.dat[k] left = self.query_rec(a, b, k*2+1, l, (l+r)//2) right = self.query_rec(a, b, k*2+2, (l+r)//2, r) return min(left, right) def query(self, a, b): return self.query_rec(a, b, 0, 0, self.n) class SegTree_Max: def __init__(self, n): self.n = 1 while (self.n < n): self.n <<= 1 self.dat = [0] * (2*self.n-1) def update(self, x, k): k += self.n - 1 self.dat[k] = x while(k > 0): if (self.dat[(k-1)//2] < self.dat[k]): self.dat[(k-1)//2] = self.dat[k] k = (k-1) // 2 def query_rec(self, a, b, k, l, r): if (b <= l or r <= a): return 0 if (a<=l and r <= b): return self.dat[k] left = self.query_rec(a, b, k*2+1, l, (l+r)//2) right = self.query_rec(a, b, k*2+2, (l+r)//2, r) return max(left, right) def query(self, a, b): return self.query_rec(a, b, 0, 0, self.n) """ main """ N, M = map(int, input().split()) E = list ( list( map(int,input().split()) ) for _ in range(M) ) idx = 0 maxex = 0 for m in range(M): segmin = SegTree_Min(N) segmax = SegTree_Max(N) for k in range(N): segmin.update(E[m][k], k) segmax.update(E[m][k], k) ans = 0 for i in range(0, N): for j in range(i+1, N): maximam = 0 if (E[m][i] < E[m][j]): tmp = segmax.query(0,i) if (tmp > E[m][i]): maximam = max(E[m][i],E[m][j],tmp, maximam) tmp = segmin.query(i,j) if (tmp < E[m][i]): maximam = max(E[m][i],E[m][j],tmp, maximam) tmp = segmax.query(i,j) if (tmp > E[m][j]): maximam = max(E[m][i],E[m][j],tmp, maximam) tmp = segmin.query(j,N) if (tmp < E[m][j]): maximam = max(E[m][i],E[m][j],tmp, maximam) if (E[m][i] > E[m][j]): tmp = segmin.query(0,i) if (tmp < E[m][i]): maximam = max(E[m][i],E[m][j],tmp, maximam) tmp = segmax.query(i,j) if (tmp > E[m][i]): maximam = max(E[m][i],E[m][j],tmp, maximam) tmp = segmin.query(i,j) if (tmp < E[m][j]): maximam = max(E[m][i],E[m][j],tmp, maximam) tmp = segmax.query(j,N) if (tmp > E[m][j]): maximam = max(E[m][i],E[m][j],tmp, maximam) ans += maximam expectation = ans if (idx==-1 or expectation > maxex): idx = m maxex = expectation print (idx)