タイトル説明
サーバントはスマートでできる人です。彼は明確に自分のアカウントを作成するために、完全な金持ち、金持ちとして10年間働きました。要件は、執事のk回の1日アカウント、スマートで有能な執事、家政婦を覚えているので、常に豊富に満足します。しかし、いくつかの挑発に、金持ちや家政婦は疑問を持っていました。口座番号Bへ:だから彼は時々、...、それぞれ数1、2によると、忠実な執事に彼の口座を決定するために、特別なメソッドを使用して、家政婦の問題を依頼することを決め、問題は、そのようなことです最小合計は何ですか?家政婦は、彼は常にfalse問題だった回以上を依頼する時間を持っていなかったようにするために。
入力形式
最初の行は、2つの入力数mを有し、nはM(M <= 100000)Tのアカウントを発現し、問題がn個有し、Nを表し、n <= 100000。
それぞれ二行数m、マネー口座数
N、N後列は問題があり、各ラインは、二つの図は、アカウント数の終わりの始まりを示しています。
出力フォーマット
各質問への回答の出力ファイル。具体的な例を見ます。
サンプル入力と出力
入力#1
3 10 1 2 3 4 5 6 7 8 9 10 2 7 3 9 1 10
出力#1
2 3 1
問題の解決策
これは、セグメントテンプレートツリーの対象です。:私は、テンプレートからツリーラインを参照してくださいhttps://baijiahao.baidu.com/s?id=1605870136961096251&wfr=spider&for=pc。元のテンプレートは、加算範囲セグメントで今最小間隔です。
1の#include <iostreamの> 2の#include <stdio.hの> 3の#include <math.h>の 4の#include <アルゴリズム> 5の#include < 文字列・H> 6 の#defineっ長い長い 7 8 のconst int型 MAXN = 1000001 。 9 10 使って 名前空間STDを、 11 12のLL N、M、[MAXN]、ANS [MAXN << 2 ]、タグ[MAXN << 2 ]。 13の 14 のLL LS(LLのX) 15 { 16 リターン X << 1 。 17 } 18個の 19 LLのRS(LLのX) 20 { 21 リターン X << 1 | 1 ; 22 } 23 24 空隙push_up(LLのP) 25 { 26 ANS [P] = 分(ANS [LS(P)]、ANS [RS(P)])。 27 } 28 29 空隙ビルド(LL pを、LLのL、LLのR) 30 { 31 タグ[P] = 0 ; 32 場合(L == R) 33 { 34 ANS [Pは] = [L]を、 35 リターン; 36 } 37 LLミッド=(L + R)>> 1 。 38 ビルド(LS(P)、L、MID)。 39 ビルド(RS(P)、ミッド+ 1 、R)。 40 push_up(P)。 41 } 42 43 空隙F(LL pを、LLのL、R -1,11,11-のK) 44 { 45 タグ[P] =タグ[P] + K。 46の ANS [P] =のANS [P] + K *(R - L + 1 )。 47 } 48 49 空隙push_down(LL pを、LLのL、LLのR) 50 { 51 LLミッド=(L + R)>> 1 。 52 F(LS(P)、L、中間、タグ[P])。 53 F(RS(P)、ミッド+ 1 、R、タグ[P])。 54 タグ[P] = 0 ; 55 } 56 57 LLクエリ(q_x LL、q_y -1,11,11-のL、R -1,11,11-のP) 58 { 59件 のLL RES = 922337203685477580 。 60 であれば(q_x <= 1 && R <= q_y) 61 { 62の リターンANS [P]。 63 } 64 LLミッド=(L + R)>> 1 。 65 push_down(P、L、R)。 66 であれば(q_x <= MID) 67 { 68の RES = 分(RES、クエリ(q_x、q_y、L、中間、LS(P)))。 69 } 70 であれば(q_y> MID) 71 { 72の RES =分(RES、クエリ(q_x、q_y、中間+ 1 、R、RS(P)))。 73 } 74の リターンRES。 75 } 76 77 のint main()の 78 { 79 のLL E、F。 80 のscanf(" %のLLDの%のLLD "、&N、&M)。 81 のために(LL i = 1 ; iが<= N; iが++ ) 82 { 83 のscanf(" %のLLD "、および[I])。 84 } 85 ビルド(1、1 、N) 86 のために(LL i = 1 ; iが<= M; iは++ ) 87 { 88 のscanf(" %のLLDの%のLLD "、&E&F)。 89 のprintf(" %のLLD "、クエリ(E、F、1、nは、1 ))。 90 } 91 リターン 0 。 92 }