結果
| 問題 |
No.3305 Shift Sort
|
| コンテスト | |
| ユーザー |
ゼット
|
| 提出日時 | 2025-10-05 15:37:14 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 840 ms / 2,000 ms |
| コード長 | 1,689 bytes |
| コンパイル時間 | 395 ms |
| コンパイル使用メモリ | 82,752 KB |
| 実行使用メモリ | 127,416 KB |
| 最終ジャッジ日時 | 2025-10-05 15:37:34 |
| 合計ジャッジ時間 | 17,696 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 20 |
ソースコード
class segtree:
def __init__(self,n):
self.size=1
while self.size<n:
self.size*=2
self.dat=[-1]*(self.size*2)
def update(self,x,a):
x+=self.size
self.dat[x]=a
while x>1:
x//=2
self.dat[x]=max(self.dat[2*x],self.dat[2*x+1])
def querry(self,u,v):
u+=self.size
v+=self.size
score=-10**10
while u<v:
if u&1:
score=max(score,self.dat[u])
u+=1
if v&1:
v-=1
score=max(score,self.dat[v])
u//=2
v//=2
return score
class segtreecount:
def __init__(self,n):
self.size=1
while self.size<n:
self.size*=2
self.dat=[0]*(self.size*2)
def update(self,x,a):
x+=self.size
self.dat[x]+=a
while x>1:
x//=2
self.dat[x]=(self.dat[2*x]+self.dat[2*x+1])
def querry(self,u,v):
u+=self.size
v+=self.size
score=0
while u<v:
if u&1:
score+=self.dat[u]
u+=1
if v&1:
v-=1
score+=self.dat[v]
u//=2
v//=2
return score
N,Q=map(int,input().split())
A=list(map(int,input().split()))
Z=segtree(N+1)
p=[0]*(N+1)
for i in range(N):
x=A[i]
p[x]=i
for i in range(N):
Z.update(i,i)
G=[[] for i in range(N)]
R=[[] for i in range(N)]
Zcount=segtreecount(N)
for x in range(1,N+1):
pos=p[x]
a=Z.querry(0,pos)
if a>=0:
l=a
G[l].append(pos)
Zcount.update(pos,1)
Z.update(pos,-10**10)
for i in range(Q):
l,r=map(int,input().split())
l-=1
r-=1
R[l].append((r,i))
result=[0]*Q
for l in range(N):
for B in R[l]:
r,t=B[:]
count=Zcount.querry(0,r+1)
result[t]=count
for pos in G[l]:
Zcount.update(pos,-1)
for i in range(Q):
print(result[i])
ゼット