質問の意味:
ソリューション:
- それはたくさんの木のラインのように見えます
- あなたは20以下である各ベクトルはその複雑さが十分であることを保証するために、プレフィックスとサフィックスのセーブすべての点にベクトルを開くことができるように、または唯一の唯一のログレベルの合計を育てます
- 組み合わせ答えたときにサフィックス区間の左と右のセクションの列挙に限り接頭辞
- 限り、左の部分木の最初のセットの一時右部分木として、その後、合併サフィックスサフィックスは、それが現在のサフィックスと同じであれば同じではありません最後に比較して、サフィックスを列挙またはベクトルのプレフィックスとサフィックスのためになるよう一緒に行くとき彼は後者がよりを把握言いました!!!
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 CONSTの INT N = 1E5 + 100 。 #define llの長い長い int型N、M、X、[N]。 構造体のノード { ベクトル <ペア< int型、int型 >> 前、最後の; ANS LL; ノード(){年齢 = 0 ;} } T [N << 2 ]。 LL getans(ノードと、ノード&B) { LL ANS = 0 。 用(オート&I:a.last)用(オート&J:b.pre) の場合((i.first | j.first)> = x)のANS + =(LL)i.second * (LL)j.second。 戻るANSを。 } ノードpush_up(ノード&A、ノード&B) { もし(a.last.size()== 0)リターンB。 もし(b.last.size()== 0)を返します。 ノードの一時。 temp.ans = a.ans + b.ans。 temp.ans + = getans(A、B)。 temp.last = b.last。 INT U = temp.last.back()最初。 用(オート&:a.last V) { もし。((v.first | U)== U)temp.last.back()第二+ = v.second。 他 temp.last.push_back({(v.first | U)、v.second})、U =(U | v.first)。 } temp.pre = a.pre。 U = temp.pre.back()最初。 用(オート&:b.pre V) { もし。((v.first | U)== U)temp.pre.back()第二+ = v.second。 他 temp.pre.push_back({(v.first | U)、v.second})、U =(U | v.first)。 } 戻り温度; } 空のビルド(int型の L、int型の R、int型POS) { もし(1- ==のR) { T [POS] .last.push_back({[L]、1 })。 T [POS] .pre.push_back({[L]、1 })。 [POS]は.ans Tは = [L]> = X。 返します。 } INT、M =(L + R)>> 1 。 (L、M、POS構築 << 1);ビルド(M + 1、R、POS << 1 | 1 )。 T [POS] = push_up(T [POS << 1 ]、T [POS << 1 | 1 ])。 } 空アップノード(あなた xxは、あなたは、V あなたがしている、あなたがしているダウン、あなたPOS) { もし(1- ==のR) { [L] = V。 [POS]は.ans Tは = [L]> = X。 T [POS] .pre.clear(); T [POS] .last.clear()。 T [POS] .pre.push_back({V、1 })。 T [POS] .last.push_back({V、1 })。 返します。 } INT、M =(L + R)>> 1 。 もし(XX <= M)アップノード(XX、V、L、M、POS << 1 )。 他のアップノード(XX、V、M + 1、R、POS << 1 | 1 )。 T [POS] = push_up(T [POS << 1 ]、T [POS << 1 | 1 ])。 } ノードqsum(int型 L、INT R、int型の L、int型の R、int型POS) { もし(L <= 1 && R <= R)戻りT [POS]。 INT、M =(L + R)>> 1 。 ノード年。 もし(L <= M) { ノードT = qsum(L、R、L、M、POS << 1 )。 年 = push_up(トン、年); } もし(R> M) { ノードT = qsum(L、R、M + 1、R、POS << 1 | 1 )。 年 = push_up(t年); } 返す歳; } int型のmain() { CIN >> N >> M >> X。 以下のために(int型私= 1 ; iが<= N; iが++)のscanf(" %dの"、および[I])。 (ビルド1、nは、1)。int型のオペアンプ、U、V; しばらく(M-- ) { scanf関数(" %D%D%D "、&OP&U、およびV)。 もし(OP == 1)アップノード(U、V、1、nは、1 )。 他のprintf(" %LLDの\ nを"、qsum(U、V、1、nは、1 ).ans)。 } リターン 0 ; }