結果
問題 | No.1222 -101 |
ユーザー | 👑 SPD_9X2 |
提出日時 | 2020-09-04 22:59:34 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,906 bytes |
コンパイル時間 | 305 ms |
コンパイル使用メモリ | 82,048 KB |
実行使用メモリ | 100,172 KB |
最終ジャッジ日時 | 2024-11-26 20:54:52 |
合計ジャッジ時間 | 7,065 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 38 ms
51,712 KB |
testcase_01 | AC | 37 ms
51,840 KB |
testcase_02 | AC | 39 ms
52,608 KB |
testcase_03 | AC | 39 ms
52,096 KB |
testcase_04 | AC | 39 ms
52,352 KB |
testcase_05 | AC | 38 ms
52,096 KB |
testcase_06 | AC | 38 ms
52,096 KB |
testcase_07 | AC | 37 ms
51,968 KB |
testcase_08 | AC | 38 ms
52,096 KB |
testcase_09 | AC | 40 ms
52,480 KB |
testcase_10 | AC | 235 ms
93,568 KB |
testcase_11 | AC | 203 ms
93,184 KB |
testcase_12 | WA | - |
testcase_13 | WA | - |
testcase_14 | WA | - |
testcase_15 | WA | - |
testcase_16 | WA | - |
testcase_17 | WA | - |
testcase_18 | WA | - |
testcase_19 | WA | - |
testcase_20 | WA | - |
testcase_21 | WA | - |
testcase_22 | AC | 39 ms
51,584 KB |
testcase_23 | AC | 37 ms
51,712 KB |
testcase_24 | AC | 38 ms
52,224 KB |
testcase_25 | AC | 39 ms
52,224 KB |
testcase_26 | AC | 37 ms
51,584 KB |
testcase_27 | AC | 38 ms
51,840 KB |
testcase_28 | AC | 38 ms
52,480 KB |
testcase_29 | AC | 39 ms
52,608 KB |
testcase_30 | AC | 39 ms
52,608 KB |
testcase_31 | AC | 39 ms
52,480 KB |
testcase_32 | WA | - |
testcase_33 | WA | - |
testcase_34 | AC | 161 ms
87,808 KB |
testcase_35 | AC | 155 ms
87,936 KB |
testcase_36 | WA | - |
testcase_37 | WA | - |
testcase_38 | WA | - |
ソースコード
""" Rが違うのを利用する→右端で+- and 0を調整できる 多分imos法 0でない区間に突入していたら0を置かない 0の区間の帳尻合わせは? 最後に0を置いたindexで管理? dp[最後に0を置いたindex] = 満たす通り数 で管理できる? 1の区間の右端はどうせ1通りに決まる 0の区間の右端は、最後に0を置いたindexにより分岐 なんの区間にも属さない→3^?を最後に掛ければいい -1 or 1の区間(中間)→どちらか好きな方を置く(2) -1 or 1の区間(最期)→決まったほうを置く(1) 0の区間(中間) → -1,0,1好きなのを置ける 0を置いた場合、dpを更新 0の区間(最期) → 0を一度でも置いていた場合は自由、そうでない場合は0 dpを1箇所更新する & 全体に掛ける なので、dp配列に入れた時点でかけていた数字が分ればなんとかなる? 全体にかけている数字Xを用意していおいて,実際のdp配列には realdp[i] * inv(X)を入れておけばいい 取り出すときはXをかけ、戻すときはinvXを書ける →普通のセグ木で解ける """ #0-indexed , 半開区間[a,b) #calc変更で演算変更 class SegTree: def __init__(self,N,first): self.NO = 2**(N-1).bit_length() self.First = first self.data = [first] * (2*self.NO) def calc(self,l,r): return l+r def update(self,ind,x): ind += self.NO - 1 self.data[ind] = x while ind >= 0: ind = (ind - 1)//2 self.data[ind] = self.calc(self.data[2*ind+1],self.data[2*ind+2]) def query(self,l,r): L = l + self.NO R = r + self.NO s = self.First while L < R: if R & 1: R -= 1 s = self.calc(s , self.data[R-1]) if L & 1: s = self.calc(s , self.data[L-1]) L += 1 L >>= 1 R >>= 1 return s def inverse(a,mod): #aのmodを法にした逆元を返す return pow(a,mod-2,mod) from sys import stdin import sys N,M = map(int,stdin.readline().split()) T = SegTree(N+1,0) T.update(0,1) mod = 10**9+7 X = 1 R = [ (None,None) for i in range(N+1) ] OS = [0] * (N+1) #1or-1の区間開始を告げる for loop in range(M): l,r,p = map(int,stdin.readline().split()) R[r] = (l,abs(p)) if p != 0: OS[l] += 1 of = 0 LEFT = 0 half = inverse(2,mod) for i in range(1,N+1): of += OS[i] l,p = R[i] #print (i,of) if p == 1: of -= 1 continue elif of == 0: tmpsum = T.query(LEFT,i) * half T.update(i,tmpsum % mod) X *= 2 X %= mod else: X *= 2 X %= mod #切り捨てフェーズ if p == 0: LEFT = l #print (LEFT,X) print (T.query(LEFT,N+1) * X % mod)