教育Codeforcesラウンド72(本部のために評価した。2)E(セグメントツリー、思考)

#define HAVE_STRUCT_TIMESPEC
する#include <ビット/ STDC ++ H>
使用して名前空間std。
#define BUF_SIZE 100000
BOOLのioerror = 0; //加了读入挂才1900ms +卡DDL过的、不加读入代码tleT_T
インラインチャーNC(){
[BUF_SIZE]、* P1 = BUF + BUF_SIZE BUF静的CHAR、*保留= BUF + BUF_SIZE。
IF(P1 == PEND){
P1 = BUF。
PEND = BUF +のfread(BUF、1、BUF_SIZE、STDIN)。
IF(PEND == P1){
例外IOError = 1。
-1を返します。
}
}
* P1を++返します。
}
インラインブールブランク(チャーCH){
戻りCH == ' '|| CH ==' \ n '|| CH ==' \ R '|| CH ==' \ tの';
}
インラインボイド読み取る(INT&X){
チャーCH。
int型の記号= 1;
一方、(ブランク(CH = NC()))。
(例外IOError)の復帰であれば、
もし(CH ==」
-1 =サイン;
CH = NC();
}
のための(X = CH-'0 ';(CH = NC())> =' 0 '&& CH <=' 9 '; 10 + X = CH-、X *' 0「);
X =記号*;は
}
; [200007] int型
のtypedef構造体{LSTの
int型のL、R&LT、MIDと、
; Mnは、Mn2の値int
};
LSTツリー[15] [800 007]; // 10本のセグメントツリーを構築します、各ビットのデジタル保存の各位置は、小数点数であり、この数は0 2E9保存する位置である
INT TAMPを[7];
フラグINTに、INT RT){アップ無効
[を1]タンプ=ツリー[RT << 1] .mn [フラグに];
TAMP [フラグに] [2] =ツリー[RT << 1。] .mn2;
[3] TAMP =ツリー[フラグに] [。。RT 1 << | 1] .mn。
; .mn2 | [1 RT << 1] [4] =ツリー[フラグ]を突き固める
ソート(TAMP + 1、TAMP + 5); //ここでは、並べ替え、おそらく、掃引よりも遅く、再び、遅い実行するための重要な理由かもしれません回、コードは他の2倍遅いのであってもT_T
[フラグに]ツリー[RT] = TAMP .mnの[1]、
[フラグに]ツリー[RT] = .mn2 TAMP [2];
リターン;
}
ボイドビルド(INTフラグ、int型RT、int型のL、R INT){
ツリー[フラグ] [RT] .L = L。
ツリー[フラグ] [RT] .R = R。
IF(L == R){
int型TMP = [L] / POW(10、FLAG-1)。
IF(TMP%10 == 0)
ツリー[フラグ] [RT] .mn =ツリー[フラグ] [RT] .mn2 = 2E9。
他{
ツリー[フラグ] [RT] .mn = A [L]。
ツリー[フラグ] [RT] .mn2 = 2E9。
}
を返します。
}
INT半ば=ツリー[フラグ] [RT] .MID = L + R >> 1。
ビルド(フラグ、RT << 1、L、MID)。
(フラグ、RT << 1 | 1、ミッド+ 1、r)を構築します。
アップ(フラグ、RT)。
返します。
}
ボイド更新(INTフラグ、int型RT、int型のPOS、int型のval){
IF(ツリー[フラグ] [RT] .L ==ツリー[フラグ] [RT] .R){
ツリー[フラグ] [RT] .mn =ヴァル;
ツリー[フラグ] [RT] .mn2 = 2E9。
返します。
}
IF(POS <=ツリー[フラグ] [RT] .MID)
更新(フラグ、RT << 1、POS、ヴァル)。
他の
更新(フラグ、RT << 1 | 1、POS、val)で、
アップ(フラグ、RT)。
}
ペア<整数、整数>クエリ(INTフラグ、int型RT、int型のL、INT R){
IF(ツリー[フラグ] [RT] .L> R &&ツリー[フラグ] [RT] .R <L)
リターン対<INT 、INT>(2e9,2e9)。
IF(ツリー[フラグ] [RT] .L> = L &&ツリー[フラグ] [RT] .R <= r)は
リターン対<整数、整数>(ツリー[フラグ] [RT] .mn、ツリー[フラグ] [RT ] .mn2)。
対<整数、整数> TMP(2e9,2e9)。
IF(ツリー[フラグ] [RT] .MID> = 1)
TMP =クエリ(フラグ、RT << 1、L、R)。
IF(ツリー[フラグ] [RT] .MID <R){
対<整数、整数> TP =クエリ(フラグ、RT << 1 | 1、L、R)。
タンプ[1] = tp.first。
タンプ[2] = tp.second。
タンプ[3] = tmp.first。
タンプ= tmp.second [4];
ソート(+ TAMP 1、TAMP + 5); //オフ副走査より再び。
TMP = {TAMP、TAMP [2] [1];}
}
戻りTMP;
}
int型のmain(){
int型N-、M;
リード(N-)、リード(M)
のための(INT I = 1; I <= N- ; I)が++
リード([I]);
のための(INT I = 1; I ++); I = 10 <
ビルド(I、1,1、N-);
のための(INT I = 1; I <= M; I ++){
int型のX、Y、Z、
リード(X)、リード(Y)、リード(Z)
。IF(X == 1)
。(INT 1 = J; J <= 10; ++ J){
int型TMP = Z / POW(10 ,. 1-J);
IF(TMP 10%)
更新(J ,. 1、Y、Z); //これはデジタルゼロでない更新され、この意志ビットは、Zとなる
他の
このビットがデジタルゼロに更新される//このビットは2E9になり、更新(J ,. 1、Y、2E9)
}
{他
ロングロングMX = 2E18;
(INTのために1 J =。 ; J <= 10; J ++){
対<整数、整数>クエリ= PR(J ,. 1、Y、Z);
IF(pr.second == 2E9)
続行; //間隔J内のy〜zのどの2つの数字が上のゼロからの違いはありません
他の
MX =分(MX、1LL * * pr.second pr.first 1LL +); //この区間jの内のY〜zは2の数は0ではありませんしている、答えは最小2に更新されますそして数
}
IF(MXの== 2E18)
COUT << - 1 << "\ N-";

COUT MX << << "\ N-";
}
}
戻り0;
}

おすすめ

転載: www.cnblogs.com/ldudxy/p/11518201.html