E.範囲の削除
問題の意味:間隔内で[X、Y]内のすべてのシーケンス番号を削除する操作のシーケンスFの定義(x、y)を与えられました。彼は、溶液の数である操作f(x、y)を非減少の残りの数を作るために頼みました。
ソリューション:、ダブルポインタが熟練していない、思考を維持することはできませんしないでください。アイデアやコードが学んでいるhttps://edwiv.com/archives/587巨大な人を。
その下に私は理解:私たちは、動作[L、R]が妥当であるかを検討しますか?簡単に三つの条件を考えることができる:①残りの図を削除した後に単調に増加する位置であり、②デジタル[R + 1、x]は単調ナンバー3、L-1を増加させる位置である[1、L-1です。]全ての位置は、1 + rよりも小さくなければなりません。だから、私たちの仕事は、このシーケンスを前処理ですぐにこれらの三つの条件を決定することが可能となります。
posmin[maxn] posmax[maxn]
各添字の最小および最大数を表す
premax[maxn] sufmin[maxn]
最大値/最小値を示す[1]、[I] / [I 、x]は出現数の範囲の目標値を
precan[maxn] sufcan[maxn]
表す[1、i]が正当なものである、[I、 x]は正当なものです
次いで、分析[L、R]が操作であるかどうかの合理的な条件である:precan [L-1] && sufcan [R + 1] &&(premax [L-1] <sufmin [R + 1]); //これは、ました上記3つの条件に対応
そこでここではすぐに行動の合法性を決定するためにO(1)にできるようになり、次のステップは、統計的な答えがあります。N ^ 2つの統計コースタイムアウトしない、二重ポインタ先端が電流Iを得るために、左の点の実際の動きを決定した後、L-1 Rの左端点の右端のRが継承、左端点列挙L、本明細書で使用されます統計的な答えを貢献できるRを指している必要があり、右には、X-R + 1、わずかです。ここでの正確さに基づいている:[L、R]は合理的である場合、Rは、L + 1がLよりも大きくなければならない、R、左右端点をインクリメント同期されています。
1つの#include <ビット/ STDC ++ H.> 2 使用して 名前空間STD; 3のtypedef ロング ロングLL; 4 のconst int型 N = 1E6 + 10 ; 5 int型N-、X、A [N]; 6 int型posmin [N]、POSMAX [N ]、PreMax [N]、sufmin [N]; 7 BOOL precan [N]、sufcan [N]; 8 。9 BOOLチェック(int型 L、INT R&LT){ // もし削除した判定区間[L、R]合理的な答え 10 リターン precan 1- [ 1 ] && sufcan [R&LT + 1 ] &&(PreMax [1-1 ] <sufmin [R + 1 ])。 11 } 12 13 のint main()の 14 { 15 CIN >> N >> X。 16 のmemset(posmin、0x3fを、はsizeof (posmin))。 17 のmemset(POSMAX、0、はsizeof (POSMAX))。 18 のために(int型 i = 1 ; iが<= N; iが++ ){ 19 のscanf(" %dの"、および[I])。 20 posmin [I] = 分(posmin [I]、I)。 21 POSMAX [I] = MAX(POSMAX [I]、I)。 22 } 23 のための(int型 i = 1 ; iが= xを<; I ++)はpremax [I] = MAX(premax [I- 1 ]、POSMAX [I])。 24 sufmin [X + 1 ] = N + 1。以下のために(int型 I = xを、I; i--)sufmin [I] =分(sufmin [I + 1 ]、posmin [I])。 25 のmemset(precan、0、はsizeof(precan))。precan [ 0 ] = 1 。 26 のためには、(int型 i = 1 ; iは= xを<; iは++)precan [I] = precan [I- 1] &&(posmin [I]> premax [I- 1 ])。 27 のmemset(sufcan、0、はsizeof(sufcan))。sufcan [X + 1 ] = 1 。 28 のためには、(int型 I = xを、I; i--)[I] = sufcanをsufcan [I + 1 ] &&(POSMAX [I] <sufmin [I + 1 ])。 29の 30 LL ANS = 0 。 31 INTは L = 1、R = 1。 // 双指针 32 のために(; L <= xであり、L ++){ // 左指针遍历 33 場合(L> R)R = L。 34 しばらくR&LT ++(R&LT <X &&(チェックL、R&LT)!); //は、右ポインタ移動 35を IF ANS + =(X-R&LT +((L、R&LT)チェック)を1); // 蓄積左ポインタ寄与L時間であります(X-R&LT + 1) 36 } 37 [ << << ANS COUT ENDLは、 38である 戻り 0 ; 39 }
F.スカラークエリ
解決策:オペレーターが順位番号を推測することができるが、答えを得るために貢献を掛けたが、それでもそれはqwqしませんでした。参考https://www.cnblogs.com/carcar/p/10877964.html巨大な男。
自分の理解についてのトーク:実際には、その答えは、オペレータD [I] * [I見つけることは容易である ]を。D [i]は係数事実[I]を含むすべてのセクションは、[I]の数であることは、ランキングの合計です。だから、これはどのように速くD [i]を考慮することができますか?私たちは、この角度からの寄与を考えます:
左の[i]は、唯一の[J] <[I](J <I)上のとき[J]と[i]のランキングの役割とリフティング効果のランキングを向上させますすべては([J]と[i]は)効果的な間隔ですが含まれています。
同様にリフティングランキングの作用、及び、すべてが[j]を含む場合にのみ、[i]は右にしか[J] <[I](J <I)および[I]であります有効範囲。
次に、[i]は自分と同じ道を、自分自身の改善のランキングを与えます。
その後、我々は[J] <[i]と、すべての[i]は、それを区間[J]の番号を含めるどのくらいの速計算しますか?例分析を左の[i]は、近い検査は明らかに実際に間隔J *の数は、(N-i + 1)が、A [j]は、jのそれぞれについて、この係数は、のと変わらないこと[I]因子(N-I + 1)は変更されません。我々は、すべて実行する必要がすぐにああ、[J] <の[i]のjの係数の合計をカウントするのですか?そのフェンウィックの木ではありません。はい、私たちは、[i]は、この問題が解決され、再び右から左に掃引、統計的フェンウィックツリーの使用上の左から右へとDの後に得られた統計を掃引します。
1つの#include <ビット/ STDC ++ H> 2 使用して 名前空間STDを、 3 typedefの長い 長いLL。 4 のconst int型 N = 5E5 + 10 。 5 のconst int型 P = 1E9 + 7 。 6 INTのN、M、[N]、B [N]、RK [N]。 7 LLのD [N]。 8 9 LL和[N]。 10 ボイド更新(int型のx、int型V){ 11 のために(; X <= Nであり、X + = X&-x)和[X] + = V、和[X]%= P。 12 } 13 LLクエリ(INT X){ 14 LLのRET = 0 。 15 のために(; X; X - = X&-x)RET + =合計[x]は、RETの%= P。 16 リターンRET; 17 } 18 19 のint main()の 20 { 21 CIN >> N。 22 のために(int型 i = 1 ; iが<= N; iが++)のscanf(" %dの"、および[I])、[I] = B [I]を、 23 ソート(B + 1、B + N + 1 )。 24 のために(INT I = 1; [I] = LOWER_BOUND(B +)は、i ++はRKを、iが<= N 1、B + N + 1 - 、[I]); B 25 26 のために(int型 i = 1 ; iがn = <; iは++){ // 计算[1、I-1]区间的贡献 27 D [I] =(D [i]が+クエリ(RK [1] - 1)*(N-I + 1)%P)%のP。 28 更新(RK [i]は、I)。 29 } 30 のための(int型 i = 1 ; iが<= N; iが++)D [I] =(D [i]が+(LL)I *(N-I + 1)%P)%のP。 // 计算[I、I]的贡献 31 のmemset(和、0、はsizeof (合計))。 32 のためには、(int型 I = N; I; i--){ // 计算[I + 1、N]的贡献 33 D [i]は=(Dの[I] +クエリ(RK [1] - 1)*( I)%のP)%のP。 34 更新(RK [i]は、N-I + 1 )。 35 } 36 37 LL ANS = 0 。 38 のために(int型 i = 1 ; iが++; iが<= N)= ANS(ANS + [I] * D [i]は%P)%のP。 39 coutの<< ANS << てendl; 40 リターン 0 ; 41 }