結果
| 問題 |
No.905 Sorted?
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2020-04-12 12:35:08 |
| 言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
| 結果 |
RE
|
| 実行時間 | - |
| コード長 | 2,258 bytes |
| コンパイル時間 | 92 ms |
| コンパイル使用メモリ | 12,928 KB |
| 実行使用メモリ | 22,848 KB |
| 最終ジャッジ日時 | 2024-09-22 02:20:26 |
| 合計ジャッジ時間 | 16,773 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 22 RE * 1 |
ソースコード
MOD = 10 ** 9 + 7
INF = 10 ** 10
import sys
sys.setrecursionlimit(100000000)
dy = (-1,0,1,0)
dx = (0,1,0,-1)
from collections import deque
from heapq import heapify,heappush,heappop
class SegmentTree():
def __init__(self,init_val,n,func): #init_valは長さnの配列 O(2n)
self.unit = 1
self.size = pow(2,n-1).bit_length() #n以上の最小の2のべき乗
self.seg = [self.unit]*2*self.size #セグメントツリー本体
self.f = func #セグ木により異なる関数
for i in range(n):
self.seg[i+self.size-1] = init_val[i]
for i in range(self.size-2,-1,-1):
self.seg[i] = self.f(self.seg[2*i+1],self.seg[2*i+2])
def update(self,k,x): #k番目の要素をxに変更する O(logN)
k+=self.size-1
self.seg[k]=x
while k:
k=(k-1)//2
self.seg[k]=self.f(self.seg[2*k+1],self.seg[2*k+2])
def query(self,p,q): #[p,q)のクエリに答える 半開区間であることに注意 O(logN)
if q<=p:
return self.unit
p+=self.size-1
q+=self.size-2
res=self.unit
while q-p>1:
if (p&1)==0:
res=self.f(res,self.seg[p])
if (q&1)==1:
res=self.f(res,self.seg[q])
q-=1
p//=2
q=(q-1)//2
if p==q:
res=self.f(res,self.seg[p])
else:
res=self.f(self.f(res,self.seg[p]),self.seg[q])
return res
def f(x,y):
return (x&y)
def main():
n = int(input())
a = list(map(int,input().split()))
inc = []
dec = []
for i in range(n - 1):
if a[i] == a[i + 1]:
inc.append(1)
dec.append(1)
elif a[i] < a[i + 1]:
inc.append(1)
dec.append(0)
else:
inc.append(0)
dec.append(1)
st_inc = SegmentTree(inc,n - 1,f)
st_dec = SegmentTree(dec,n - 1,f)
q = int(input())
for _ in range(q):
l,r = map(int,input().split())
if l == r:
print(1,1)
else:
print(st_inc.query(l,r),st_dec.query(l,r))
if __name__ =='__main__':
main()