トピックへのリンク:https://ac.nowcoder.com/acm/contest/1106/A
効果の件名:
1. 1E9長いセグメントは、各ノードは、色以上であることができます。n個の操作を与え、各動作区間で[L、R]原色色素ノードとなります。最後に、最大回数はどのくらいの染色を依頼します。
問題の解決策のアイデア:
暴力をまず考える、すなわち各間隔+1、最終結果最大値を見つけるために再び横切るが、1E9特定のタイムアウトの長さを横断します。
2.あなたが狭い長さを横断する必要が残業を解決するため、各セクションと同じ効果が、その後、我々は間隔のエンドポイントを記録することで記録を達成することができ、連続しています。すなわちの使用差配列。差分アレイB A:私はA、Aのi番目のビットの最初のi-1ビットとの間の差を表すビットの値 配列{LのAは、Rは、(kは負であってもよい)Bについて、Bのみを変更する必要がある場合、間隔] kは増加しているときに[L] + = K、B [R + 1] - = K。次に、議論エンドポイントを記録する方法:各所定の間隔の[L、R&LT]、[L、R&LT間隔毎番号+1]、すなわち、B [L] + = 1、B [R + 1] - = 1。最後のn個の動作の終了後に、B列とプレフィックスの違いは、染色の最大数を取得します。
3.インターバル1E9の長さがあるので、我々はまた、する必要が離散、私の考えは、ポイントの昇順で表示され、することです重い行きます。各点についてソートされた彼らのインデックスにマッピングされます。(マップ実現付)
コードは以下の通りであります:
1の#include <stdio.hの> 2の#include <地図> 3の#include < 文字列・H> 4の#include <アルゴリズム> 5 のconst int型 MAXN = 1E5 + 100 。 6 使用して 名前空間はstdを、 7 8 INT [MAXN]和[MAXN]、B [MAXN]。 9マップ< int型、int型 > 融点; 10 11 構造体クエリー 12 { 13 のint L、R。 14 } Q [MAXN / 2 ]。 15 16 INTmain()の 17 { 18 int型 N、CNT = 0 。 19 のscanf(" %d個"、&N) 20 のために(int型 i = 1 ; iが<= N; iが++ ) 21 { 22 のint L、R。 23 のscanf(" %dの%のD "、&L&R)。 24 Q [i]は.L = L、Q [i]は.R = R。 25 [++ CNT] = L [++ CNT = R。 26 } 27 ソート(A + 1、A +1 + CNT)。 28 INT LEN =(ユニーク(A + 1、A + 1本の + CNT) - (A + 1 ))。 29 のためには、(int型 = Iを1 ; iが<= LEN; iは++ ) 30 MP [I] = I。 31 のためには、(int型 i = 1 ; iが<= N; iが++ ) 32 { 33件の B [MP [Q [i]は.L] ++ ; 34件の B [MP [Q [i]は.R] + 1 ] - 。 35 } 36 INT ANS = 0; 37 のためには、(int型 i = 1 ; iがLEN = <; Iは++ ) 38 { 39 和[I] =和[I - 1 ] + B [i]は、 40の ANS = MAX(ANS、和[I])。 41 } 42 のprintf(" %Dを\ n " 、ANS)。 43 リターン 0 。 44 }