結果
問題 |
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])