ポータル: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型(クエリのint、int型 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 。 }