[Luogu P2801]魔法のリーダー

ポータル:https://www.luogu.org/problemnew/show/P2801

  この質問は、ちょうど木のものの2つの事業セグメントは、うまくツリーラインを維持するという気持ちを参照してくださいする時間です。しかし、卵と私は、セグメントツリーを作成する方法を忘れてしまいました。そして、データポイントを通して水を打つ暴力を考える、それはサンプルに従事し、暴力的な再生するために10分かかりました。しかし。最後に0のポイントを得た、同じ男が(本当に私があまりにも料理だった)他の巨大な暴力は100ポイントを持って書きました。

  タイトルの変更はブロックを使用することで問題の解決策をちらりと見たときに、後に、(すでにブロックを忘れてしまった)、その後、私はブロックを書き込み、またはロスバレー上の点TLE提出しますが、忘れては非常に長い時間を費やしO(msqrt(nlogn))はどのような複雑で、最終的にはO2を開いた(我々はQAQを尋ねることを敢えてしていない、知らない)データの範囲を超えていない、ポイントは(形而上学)以上です。

#include <cstdioを> 
する#include <アルゴリズム> 
の#include <iostreamの> 
する#include <cmath> 
の#include <キュー> 
の#include <ベクトル> 
の#include <CStringの> 
のtypedef 長い LL。
使用して 名前空間はstdを、
const  int型 MAXN = 1000005 ;
INTのN、M、ブロック。
int型のV [MAXN]、ベル[MAXN]、タグ[MAXN]。
ベクター < INT > VEC [ 10005 ]。
ボイドリセット(INT X){ 
    VEC [X] .clear(); 
    以下のためのint型私は=(X - 1)*ブロック+ 1私は=分(のX *ブロックを、N)<。I ++ 
        VEC [X] .push_back(V [I])。
    ソート(VEC [X] .begin()、VEC [X] .END())。
} 
)(読み取りっ                                
{ 
    LL X = 0、F = 1チャー CH = GETCHAR()。
    一方、(CH < ' 0 ' || CH> ' 9 '){ 場合(CH == ' - ')、F = - 1 ; CH = GETCHAR();}
     一方(CH> = ' 0' && CH <= ' 9 '){X = X * 10 + CH- ' 0 ' ; CH = GETCHAR();}
     戻りのx *のF。
} 
ボイド追加(int型int型 B、int型の{c)の
     ためのint型 iは= I ++は; iは=分(ベル[A] *ブロック、B)< 
        V [i]は + = C。
    リセット(ベル[A])。
    もし(ベル[A] =!ベル[B]){
         ためint型 iは=(ベル[B] - 1)*ブロック+ 1 ; iが= Bを<; I ++
            V [I] + = C。
        リセット(ベル[B])。
    } 
    のためにint型 + I =ベル[A] 1 ; iが[B] =ベルを< - 1 ; iが++ 
        タグ[I] + = C。
} 
int型(クエリのintint型 B、int型の{C)
     INT ANS = 0 以下のためにint型 iは=;私は=分(ベル[A] *ブロックを<A、B); iが++ 場合(V [i]が+タグ[ベル[] < C)
            ANS ++ もし(ベル[A]!=ベルは、[B]){
         ためint型 I =(ベル[B] - 1)*ブロック+ 1 ; iは= bを<; I ++の場合(Vの[I] +タグ[ベル[B] < C)
                ANS + + ; 
    } 
    のためにint型のI =ベル[A] + 1 ; iは<=ベル[B] - 1 ; iは++ ){
         int型、X = C - タグ[I]。
        ANS + = LOWER_BOUND(VEC [i]が.begin()、VEC [I] .END()、X) - VEC [i]が.begin()。
    } 
    戻りANS。
} 
INT {main()の
    N =(読み取り)、M =読む(); 
    ブロック = SQRT(N)。
    以下のためにint型 i = 1 ; iが<= N iが++ 
        、V [i]が。= )(読み取ります。
    以下のためにint型 i = 1 ; iが<= N; iは++ ){ 
        ベル[I] =(I - 1)/ブロック+ 1 
        VEC [ベル[I]一back(V [I])。
    } 
    のためにint型 i = 1 ; iは=ベル[N <、iは++の
        ソート(VEC [i]が.begin()、VEC [I] .END())。
    以下のためにint型私= 1 ; I <= M、I ++){
         チャー F [ 5 ]。
        scanf関数(" %sの" 、F)。
        INT A = read()は、B =読み取る()、C = 読み取ります();
        もし([F 0 ] == ' M ' 
            を追加(A、B、C)。
        
            のprintf(" %d個の\ n "、B - A + 1 - クエリ(A、B、C))。
    } 
    戻り 0 
}
コードの表示

 

おすすめ

転載: www.cnblogs.com/jiqimin/p/10992770.html