問題の意味:あなたのnのn-1の連続したセグメントは今0より大きいどのように多くのサブ期間あなたに0〜1e9-1の範囲内の全配列の長さを尋ねる表し
アイデア:私たちは現在の接頭辞を数えると仮定して、明らかに我々はフェンウィックツリーのメンテナンスの接頭辞を見ることができると私たちは答えを計算nlognが、このタイムアウトの1E7をデータ処理のために私たちは間違いなく検討するには、接頭辞であり、各変更が1でありますポリライン
私たちは直接答えを見つけるために怠惰な配列をシミュレートすることができます
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 CONSTの INT N = 1E7 + 7 。 const int型 INF = 0x3f3f3f3f 。 typedefの長い 長いLL。 CONST LL MOD = 1E7 + 9 。 INTをL [N]、R [N]。 INT F [N]、G [N]、合計[ 3 * N]。 INT [B 3 *のN]、[C 3 * N]。 int型のmain(){ IOS :: sync_with_stdio(偽); cin.tie(0)。cout.tie(0); int型のn; cinを>> N; 以下のために(int型 i = 1 ; iが<= N; iは++ ){ CIN >> L [I] >> R [i]は、 } F [ 1 ] = R [ 1 ] -1- [ 1 ] + 1 。 以下のために(int型 I = 2 ; iが<= N; iは++ ) F [I] = MAX(R [I] -1 [i]が+ 1、F [I- 1 ] - (L [I] -r [1- 1 ] - 1)+ R [I] -1- [I] + 1 )。 G [N] = R [N] -1- [N] + 1 。 にとって(int型 I = N- 1、I> = 1 ; i-- ) G [I] = MAX(R [I] -1- [I] + 1、G [I + 1 ] - (L [I + 1 ] -r [I] - 1)+ R [I] -1- [I] + 1 )。 int型 I = 1 ; int型になりました= 1E7; LL ANS = 0 。 一方(iは= < N){ int型 J = I + 1 。 一方、(j <= N && G [J] + F [J- 1 ]> =(L [J] -r [J- 1 ] - 1 )){ J ++; } J - 。 INTル= MAX(0、L [i]は-g [I])。INT RI =分(INT(1E9) - 1、R [J] + F [J])。 int型、T = I; int型の MX、MI; MX = - 1。MI = infファイル。 用(int型 K =ル; K <= RIあり、k ++ ){ 場合(K> = L [t]は&& K <= R [T]) の和[K -le + 1 ] =和[Kル] + 1 。 他 和[K -le + 1 ] =和[Kル] - 1; もし(K == R [T])T ++ 。 MX = MAX(MX、和[Kル+ 1 ] + 今)。 MI =分(MI、和[Kル+ 1 ] + 今)。 B [和[K -le + 1 ] +今] ++ ; } のための(int型 K = MX- 1、K> = MI; k-- ) B [K] + = B [K + 1 ]。 ANS + = B [今+ 1 ]。 用(int型 K =ル; K <= RIあり、k ++ ){ T =和[Kル+ 1] + 今; B [T + 1 ] - = C [T + 1 ]。 C [T] + = C [T + 1 ] + 1 。 C [T + 1 ] = 0 ; ANS + = B [T + 1 ]。 } のために(int型 K = MI; K <= MX ++ k個) B [K] = 0、C [K] = 0 ; I = J + 1 ; } COUT << ANS << ENDL。 }