結果
| 問題 |
No.3214 small square
|
| コンテスト | |
| ユーザー |
titia
|
| 提出日時 | 2025-07-29 03:16:49 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 3,210 bytes |
| コンパイル時間 | 312 ms |
| コンパイル使用メモリ | 82,352 KB |
| 実行使用メモリ | 173,712 KB |
| 最終ジャッジ日時 | 2025-07-29 03:17:37 |
| 合計ジャッジ時間 | 47,717 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 37 WA * 3 |
ソースコード
import sys
input = sys.stdin.readline
from operator import itemgetter
N,A=map(int,input().split())
P=[list(map(int,input().split())) for i in range(N)]
for i in range(N):
P[i][0]*=3
P[i][1]*=3
A*=3
YS=[]
for x,y,a in P:
YS.append(y-A)
YS.append(y+1)
YS=sorted(set(YS))
D={YS[i]:i for i in range(len(YS))}
Q=[]
for x,y,a in P:
Q.append((1,x-A,y,a))
Q.append((0,x+1,y,a))
seg_el=1<<(len(YS).bit_length()) # Segment treeの台の要素数
SEG=[0]*(2*seg_el) # 1-indexedなので、要素数2*seg_el.Segment treeの初期値で初期化
LAZY=[0]*(2*seg_el) # 1-indexedなので、要素数2*seg_el.Segment treeの初期値で初期化
def indexes(L,R): # 遅延伝搬すべきノードのリストを下から上の順に返す. (つまり, updateやgetvaluesで見るノードより上にあるノードたち)
INDLIST=[]
R-=1
L>>=1
R>>=1
while L!=R:
if L>R:
INDLIST.append(L)
L>>=1
else:
INDLIST.append(R)
R>>=1
while L!=0:
INDLIST.append(L)
L>>=1
return INDLIST
def adds(l,r,x): # 区間[l,r)を +x 更新
L=l+seg_el
R=r+seg_el
L//=(L & (-L))
R//=(R & (-R))
UPIND=indexes(L,R)
for ind in UPIND[::-1]: # 遅延伝搬. 上から更新していく. (ただし, 今回はうまくやるとこの部分を省ける. addはクエリの順番によらないので. addではなく, updateの場合必要)
if LAZY[ind]!=0:
plus_lazy=LAZY[ind]
SEG[ind<<1]+=plus_lazy
SEG[1+(ind<<1)]+=plus_lazy
LAZY[ind<<1]+=plus_lazy
LAZY[1+(ind<<1)]+=plus_lazy
LAZY[ind]=0
while L!=R:
if L > R:
SEG[L]+=x
LAZY[L]+=x
L+=1
L//=(L & (-L))
else:
R-=1
SEG[R]+=x
LAZY[R]+=x
R//=(R & (-R))
for ind in UPIND:
SEG[ind]=max(SEG[ind<<1],SEG[1+(ind<<1)]) # 最初の遅延伝搬を省いた場合, ここを変える
def getvalues(l,r): # 区間[l,r)に関するmaxを調べる
L=l+seg_el
R=r+seg_el
L//=(L & (-L))
R//=(R & (-R))
UPIND=indexes(L,R)
for ind in UPIND[::-1]: # 遅延伝搬
if LAZY[ind]!=0:
plus_lazy=LAZY[ind]
SEG[ind<<1]+=plus_lazy
SEG[1+(ind<<1)]+=plus_lazy
LAZY[ind<<1]+=plus_lazy
LAZY[1+(ind<<1)]+=plus_lazy
LAZY[ind]=0
ANS=0
while L!=R:
if L > R:
ANS=max(ANS , SEG[L])
L+=1
L//=(L & (-L))
else:
R-=1
ANS=max(ANS , SEG[R])
R//=(R & (-R))
return ANS
LANS=0
Q.sort(key=itemgetter(0))
Q.sort(key=itemgetter(1))
for com,x,y,a in Q:
left=D[y-A]
right=D[y+1]
if com==1:
adds(left,right,a)
if a>0:
LANS=max(LANS,getvalues(0,len(YS)))
else:
adds(left,right,-a)
if a<0:
LANS=max(LANS,getvalues(0,len(YS)))
print(LANS)
titia