結果
| 問題 |
No.2338 Range AtCoder Query
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2023-11-25 17:45:03 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 3,108 bytes |
| コンパイル時間 | 463 ms |
| コンパイル使用メモリ | 82,320 KB |
| 実行使用メモリ | 268,228 KB |
| 最終ジャッジ日時 | 2024-09-26 11:03:51 |
| 合計ジャッジ時間 | 28,193 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 3 WA * 3 RE * 28 |
ソースコード
from collections import deque
class MoAlgorithm():
BIT=24
MASK=(1<<BIT)-1
def __init__(self,size):
self.size=size
self.query=[]
def add_query(self,left,right):
self.query.append((left<<self.BIT)+right)
def solve(self,add_l,delete_l,add_r,delete_r,fix):
size=self.size
Q=len(self.query)
backet=int((size*pow(3,0.5))/(pow(2*Q,0.5)))+1
aft=[0 for i in range(Q)]
for i in range(Q):
lf,ri=self.query[i]>>self.BIT,self.query[i]&self.MASK
bac=lf//backet
aft[i]=(((bac<<20)+(ri*(-1 if bac&1 else 1)))<<self.BIT)+i
aft.sort()
ans=[None for i in range(Q)]
lf=0
ri=0
for x in aft:
i=x&self.MASK
l,r=self.query[i]>>self.BIT,self.query[i]&self.MASK
while ri<r:
add_r(ri);ri+=1
while ri>r:
ri-=1;delete_r(ri)
while lf<l:
delete_l(lf);lf+=1
while lf>l:
lf-=1;add_l(lf)
ans[i]=fix()
return ans
def add_l(p):
global wa,sol,solved,pena
if res[p][1]=="WA":
if len(wa[res[p][0]])==0:
wa[res[p][0]].appendleft(1)
elif wa[res[p][0]][0]==0:
wa[res[p][0]].appendleft(1)
pena+=1
else:
wa[res[p][0]][0]+=1
if solved[res[p][0]]!=0:
pena+=1
else:
wa[res[p][0]].appendleft(0)
solved[res[p][0]]+=1
if solved[res[p][0]]==1:
sol+=1
def delete_l(p):
global wa,sol,solved,pena
if res[p][1]=="WA":
wa[res[p][0]][0]-=1
if wa[res[p][0]][0]==0:
wa[res[p][0]].popleft()
if len(wa[res[p][0]])!=0:
pena-=1
else:
wa[res[p][0]].popleft()
solved[res[p][0]]-=1
if solved[res[p][0]]==0:
sol-=1
else:
pena+=wa[res[p][0]][0]
def add_r(p):
global wa,sol,solved,pena
if res[p][1]=="WA":
if len(wa[res[p][0]])==0:
wa[res[p][0]].append(1)
elif wa[res[p][0]][-1]==0:
wa[res[p][0]].append(1)
else:
wa[res[p][0]][-1]+=1
else:
wa[res[p][0]].append(0)
solved[res[p][0]]+=1
if solved[res[p][0]]==1:
sol+=1
if len(wa[res[p][0]])>=2:
pena+=wa[res[p][0]][-2]
def delete_r(p):
global wa,sol,solved,pena
if res[p][1]=="WA":
wa[res[p][0]][-1]-=1
if wa[res[p][0]][-1]==0:
wa[res[p][0]].pop()
else:
wa[res[p][0]].pop()
solved[res[p][0]]-=1
if solved[res[p][0]]==0:
sol-=1
def fix():
return sol,pena
N,M,Q=map(int,input().split())
res=[list(input().split()) for i in range(N)]
for i in range(N):
res[i]=(int(res[i][0])-1,res[i][1])
mo=MoAlgorithm(N)
for i in range(N):
L,R=map(int,input().split())
mo.add_query(L-1,R)
wa=[deque() for i in range(M)]
solved=[0]*N
sol=0
pena=0
for i in mo.solve(add_l,delete_l,add_r,delete_r,fix):
print(*i)