結果
| 問題 |
No.1625 三角形の質問
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2021-05-07 20:50:00 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 2,535 ms / 6,000 ms |
| コード長 | 5,596 bytes |
| コンパイル時間 | 439 ms |
| コンパイル使用メモリ | 82,292 KB |
| 実行使用メモリ | 282,412 KB |
| 最終ジャッジ日時 | 2024-07-18 16:34:19 |
| 合計ジャッジ時間 | 31,302 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 19 |
ソースコード
class SegmentTree:
def __init__(self, n, segfunc, ide_ele):
self.segfunc = segfunc
self.ide_ele = ide_ele
#self.num = 1 << (n - 1).bit_length()
self.tree = [ide_ele] * 2 * n
self.size = n
def update(self, k, x):
k += self.size
if self.tree[k] > x:
return
self.tree[k] = self.segfunc(self.tree[k],x)
while k > 1:
if self.tree[k >> 1] > x:
return
self.tree[k >> 1] = self.segfunc(self.tree[k], self.tree[k ^ 1])
k >>= 1
def query(self, l, r):
if r==self.size:
r = self.size
res = self.ide_ele
l += self.size
r += self.size
while l < r:
if l & 1:
res = self.segfunc(res, self.tree[l])
l += 1
if r & 1:
res = self.segfunc(res, self.tree[r - 1])
l >>= 1
r >>= 1
return res
class BIT():
def __init__(self,n):
self.BIT=[-1]*(n+1)
self.num=n
def query(self,idx):
idx += 1
res = -1
while idx > 0:
res = max(res,self.BIT[idx])
idx -= idx&(-idx)
return res
#Ai += x O(logN)
def update(self,idx,x):
idx += 1
while idx <= self.num:
self.BIT[idx] = max(self.BIT[idx],x)
idx += idx&(-idx)
return
class BIT2D():
def __init__(self,n,w_list):
self.num = n
self.val = [[] for i in range(n+1)]
self.bit = [None for i in range(n+1)]
for i in range(1,n+1):
self.val[i] += w_list[i-1]
self.val[i] = sorted(set(self.val[i]))
if self.val[i]:
self.bit[i] = BIT(len(self.val[i]))
up_idx = i + (i&(-i))
if up_idx <= self.num:
self.val[up_idx] += self.val[i]
def query(self,t,r):
res = -1
t += 1
idx = t
while idx:
if self.val[idx]:
r_idx = bisect.bisect_right(self.val[idx],r)-1
res = max(res,self.bit[idx].query(r_idx))
idx -= idx&(-idx)
return res
def update(self,t,r,S):
t += 1
while t <= self.num:
if self.val[t]:
r_idx = bisect.bisect_right(self.val[t],r)-1
self.bit[t].update(r_idx,S)
t += t&(-t)
def area(a,b,c,d,e,f):
A,B,C,D = c-a,d-b,e-a,f-b
return abs(A*D-B*C)
import sys,random,bisect
from collections import deque,defaultdict
from heapq import heapify,heappop,heappush
from itertools import permutations
from math import gcd,log
input = lambda :sys.stdin.buffer.readline()
mi = lambda :map(int,input().split())
li = lambda :list(mi())
def test(N,Q):
triangle = []
for i in range(N):
S = 0
while not S:
t = [random.randint(1,10**9) for i in range(6)]
a,b,c,d,e,f = t
S = area(a,b,c,d,e,f)
triangle.append((a,b,c,d,e,f))
query = []
for i in range(Q):
if i&1:
t = 2
l = random.randint(1,10**5)
r = random.randint(l+1,10**9)
query.append((t,l,r))
else:
t = 1
q = 1
S = 0
while not S:
t = [random.randint(1,10**9) for i in range(6)]
a,b,c,d,e,f = t
S = area(a,b,c,d,e,f)
query.append((q,a,b,c,d,e,f))
return triangle,query
def area(a,b,c,d,e,f):
A,B,C,D = c-a,d-b,e-a,f-b
return abs(A*D-B*C)
import sys,random,bisect
from collections import deque,defaultdict
from heapq import heapify,heappop,heappush
from itertools import permutations
from math import gcd,log
input = lambda :sys.stdin.buffer.readline()
mi = lambda :map(int,input().split())
li = lambda :list(mi())
n,q = mi()
Q = q
#triangle,Query = test(n,q)
triangle = [tuple(mi()) for i in range(n)]
Query = [tuple(mi()) for i in range(q)]
X = set()
for i in range(n):
a,b,c,d,e,f = triangle[i]
l,r = min(a,c,e),max(a,c,e)
triangle[i] = (l,r,area(a,b,c,d,e,f))
X.add(l)
X.add(r)
for i in range(q):
t,*query = Query[i]
if t==1:
a,b,c,d,e,f = query
l,r = min(a,c,e),max(a,c,e)
Query[i] = (1,l,r,area(a,b,c,d,e,f))
X.add(l)
X.add(r)
else:
l,r = query
X.add(l)
X.add(r)
X = sorted(X)
comp = {e:i for i,e in enumerate(X)}
H = len(comp)
ans = [-1 for i in range(Q)]
add_query = [[] for l in range(H)]
pre_query = [[] for l in range(H)]
for l,r,S in triangle:
l = comp[l]
r = comp[r]
add_query[l].append((r,S))
for i in range(Q):
t,*query = Query[i]
if t==2:
l,r = query
l,r = comp[l],comp[r]
pre_query[l].append((i,r))
Seg = BIT(H)
for l in range(H-1,-1,-1):
for r,S in add_query[l]:
Seg.update(r,S)
for idx,r in pre_query[l]:
ans[idx] = max(ans[idx],Seg.query(r))
w_list = [[] for i in range(Q)]
add_query = [[] for i in range(H)]
pre_query = [[] for r in range(H)]
for i in range(Q):
t,*query = Query[i]
if t==1:
l,r,S = query
idx = comp[l]
w_list[i].append(r)
add_query[idx].append((i,r,S))
else:
l,r = query
l = comp[l]
pre_query[l].append((i,r))
seg = BIT2D(Q,w_list)
for l in range(H-1,-1,-1):
for t,r,S in add_query[l]:
seg.update(t,r,S)
for t,r in pre_query[l]:
ans[t] = max(ans[t],seg.query(t,r))
for i in range(Q):
if Query[i][0]==2:
print(ans[i])