結果
| 問題 |
No.911 ラッキーソート
|
| コンテスト | |
| ユーザー |
mkawa2
|
| 提出日時 | 2021-03-15 16:59:51 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 432 ms / 2,000 ms |
| コード長 | 2,852 bytes |
| コンパイル時間 | 379 ms |
| コンパイル使用メモリ | 82,048 KB |
| 実行使用メモリ | 109,436 KB |
| 最終ジャッジ日時 | 2024-11-07 04:23:02 |
| 合計ジャッジ時間 | 13,987 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 46 |
ソースコード
import sys
sys.setrecursionlimit(10**6)
int1 = lambda x: int(x)-1
p2D = lambda x: print(*x, sep="\n")
def II(): return int(sys.stdin.buffer.readline())
def LI(): return list(map(int, sys.stdin.buffer.readline().split()))
def LI1(): return list(map(int1, sys.stdin.buffer.readline().split()))
def LLI(rows_number): return [LI() for _ in range(rows_number)]
def LLI1(rows_number): return [LI1() for _ in range(rows_number)]
def BI(): return sys.stdin.buffer.readline().rstrip()
def SI(): return sys.stdin.buffer.readline().rstrip().decode()
# dij = [(0, 1), (-1, 0), (0, -1), (1, 0)]
dij = [(0, 1), (-1, 0), (0, -1), (1, 0), (1, 1), (1, -1), (-1, 1), (-1, -1)]
inf = 10**16
# md = 998244353
md = 10**9+7
from functools import lru_cache
kn=62
n, l, r = LI()
aa = LI()
# for a in aa: print(bin(a)[2:].zfill(12))
bb = [-1]*kn
def chk(k, l, r):
stack=[(k,l,r)]
while stack:
k,l,r=stack.pop()
m = -1
pb = aa[l] >> k & 1
for i, a in enumerate(aa[l+1:r], l+1):
b = a >> k & 1
if b != pb:
if m == -1:
m = i
else:
return False
pb = b
if m == -1:
if k:stack.append((k-1,l,r))
else:
if bb[k] == -1:
bb[k] = 1-pb
elif bb[k] != 1-pb:
return False
if k:
stack.append((k-1, l, m))
stack.append((k-1, m, r))
return True
if chk(kn-1, 0, n) == False:
print(0)
exit()
# kケタ見終わって、その桁以降が以下でもよい(1)か、未満でなければいけない(0)か
# @lru_cache(None)
# def solve(k, f):
# if k == kn: return f
# res = 0
# if f:
# if lim[k]:
# if bb[k] != 1: res += solve(k+1, 1)
# if bb[k] != 0: res += solve(k+1, 1)
# else:
# if bb[k] != 1: res += solve(k+1, 1)
# if bb[k] != 0: res += solve(k+1, 0)
# else:
# if lim[k]:
# if bb[k] != 1: res += solve(k+1, 1)
# if bb[k] != 0: res += solve(k+1, 0)
# else:
# if bb[k] != 1: res += solve(k+1, 0)
# if bb[k] != 0: res += solve(k+1, 0)
# return res
def solve(r):
if r==-1:return 0
cc=[r>>k&1 for k in range(kn)]
dp=[[0]*2 for _ in range(kn+1)]
dp[0][0]=1
for i,(b,c) in enumerate(zip(bb[::-1],cc[::-1])):
for f in range(2):
pre=dp[i][f]
if pre==0:continue
if f:
if b!=1:dp[i+1][1]+=pre
if b!=0:dp[i+1][1]+=pre
else:
if b!=1:
if c:dp[i+1][1]+=pre
else:dp[i+1][0]+=pre
if b!=0 and c:dp[i+1][0]+=pre
# p2D(dp)
return sum(dp[-1])
ans=solve(r)-solve(l-1)
print(ans)
mkawa2