結果
| 問題 |
No.868 ハイパー部分和問題
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-08-18 13:52:05 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 705 ms / 7,000 ms |
| コード長 | 1,168 bytes |
| コンパイル時間 | 338 ms |
| コンパイル使用メモリ | 82,776 KB |
| 実行使用メモリ | 90,544 KB |
| 最終ジャッジ日時 | 2025-08-18 13:52:21 |
| 合計ジャッジ時間 | 15,174 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 38 |
ソースコード
import sys
sys.setrecursionlimit(1<<20)
input=sys.stdin.readline
MI=lambda:map(int,input().split())
li=lambda:list(MI())
ii=lambda:int(input())
n,k=li()
a=li()
q=ii()
# --- 把点修改转成存在区间 (l,r,v) ---
cur_st=[0]*n
cur_val=a[:]
iv=[]
for t in range(q):
x,v=li()
x-=1
iv.append((cur_st[x],t,cur_val[x]))
cur_st[x]=t
cur_val[x]=v
for i in range(n):
iv.append((cur_st[i],q,cur_val[i]))
# --- 线段树挂桶 ---
seg=[[] for _ in range(4*max(1,q))]
def upd(i,l,r,ql,qr,v):
if ql<=l and r<=qr:
seg[i].append(v);return
m=(l+r)//2
if ql<m: upd(i*2,l,m,ql,qr,v)
if qr>m: upd(i*2+1,m,r,ql,qr,v)
if q>0:
for l,r,v in iv:
if l<r and v<=k: # v>k对答案无贡献,直接跳过
upd(1,0,q,l,r,v)
# --- 分治 DFS:在节点吸收整段覆盖的值 ---
mask=(1<<(k+1))-1
ans=[0]*q
def dfs(i,l,r,bs):
for v in seg[i]:
bs=(bs|((bs<<v)&mask))
if r-l==1:
ans[l]=1 if (bs>>k)&1 else 0
return
m=(l+r)//2
dfs(i*2,l,m,bs)
dfs(i*2+1,m,r,bs)
if q>0:
dfs(1,0,q,1) # 初始只含和0
sys.stdout.write(''.join('1\n' if x else '0\n' for x in ans))