結果
| 問題 | 
                            No.335 門松宝くじ
                             | 
                    
| コンテスト | |
| ユーザー | 
                             soupesuteaka
                         | 
                    
| 提出日時 | 2016-02-25 08:30:42 | 
| 言語 | Python3  (3.13.1 + numpy 2.2.1 + scipy 1.14.1)  | 
                    
| 結果 | 
                             
                                TLE
                                 
                             
                            
                         | 
                    
| 実行時間 | - | 
| コード長 | 2,647 bytes | 
| コンパイル時間 | 98 ms | 
| コンパイル使用メモリ | 13,056 KB | 
| 実行使用メモリ | 18,336 KB | 
| 最終ジャッジ日時 | 2024-09-22 13:39:21 | 
| 合計ジャッジ時間 | 3,784 ms | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge2 / judge5 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 4 | 
| other | AC * 1 TLE * 1 -- * 8 | 
ソースコード
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)
            
            
            
        
            
soupesuteaka