Codeforces 라운드 # 625 (사업부. 1, Technocup 2020 최종 라운드 기준)

긴 시간은 블로그 물을 작성하지 않은 ,,,

Darkraft의 세계 : Azathoth를위한 전투

주제 링크 : https://codeforces.com/contest/1320/problem/C

질문의 의미 :    무기의 N 번호가 있으며, 각각의 무기는 가격이; M 방패는 각각의 방패 가격을 가지고, 거기에         이상한 죽이고, 각 몬스터의 공격은 X는 Y에 대한 방어 힘 K 몬스터가 Z에 금화 떨어지는 후         우리는 무기가 힘이 사이보다 더 큰 공격을 선택하고, 우리는 방패 방어의 힘이 우리가 닫아 금화를 얻을 수 있습니다, 이순신보다 큰 포착 경우         우리가 선택하고 무기와 방패를 선택해야해야, 우리가 사용할 수 있도록 최대 총 수익의 분석 :        우리는 (가격 CA)에 대한 무기를 선택했다고 가정, 실드는 B (가격 CB) 인        금의 합 그리고 우리는 이익을, 우리는 몬스터가 드롭 죽일 수 얻을 수 있습니다 - 무기 가격 - 방패 가격 CA - - ANS = 가능한 금화이며 CB 첫째, 전처리 공정 : ①, 일종의 무기로, 다음 열거 무기 ②, X 괴물 순서에 따라 ③, 무게 트리 라인 : 방어에 대한 인덱스 값, 즉 [L은 R이 [수비 값 L, 운전자 R] 나타낸다 코인에 대응 첨자 값, 즉 트리 [L를] = (10)은 쉴드는 L 방어 가능한 금 (10) 인 경우를 나타내는 마찬가지로, 우리 오픈 어레이, 상기 A [i]를 의미 아암 공격 강제 I 그리드
     






       
       
       
       
       
       
       
       

       과정을 시작하기 전에, 우리는, 우리는 속성 값 C 배열을 가진 몬스터 X에 의해 무기, 몬스터 정렬 된 정렬
       난 무기를 나타내며, j는 몬스터를 나타냅니다 - 우리는 이중 포인터를 사용 <난, j는> 프로세스에

       둘째, 계산 과정 대답 :
       ①, 우리는 난에 열거, j는 우리는이 몬스터의 공격력이 덜 나는보다 판단 할
       경우 덜 난 (C [J] .x를 <보다, ② 내가), 우리가 방어 체제를 선택하는 경우 큰 C [J] .Y, 금화보다 우리는 플러스 C [J] .Z을 얻을 수 있을까?
       즉, 현재의 무기는 난을, 그리고 국방만큼 방패는 [J] .Y, 금 방패를 사용할 C보다 많고 C를 셀 수 [J] .Z
       ③ 물론,뿐만 아니라 구매 방패 때문에 그 최대의 혜택 - 우리가 방패를 살 수 있도록 돈, 최대 (가격의 방패 가능한 금,은 방패)해야한다

       ①②③ 대응 코드

 ( INT I = 1. , I는 <=는 N-; I는 ++ ) 
{ 
    while 회 (J <= K && C [J]를 .x와 < I)은 
    { 
//는 방위군 수득 실드 아님을 나타낸다 C [J]보다 큰 나타낸다 총 수익이 C [J] .Z 수있다 
         update_range (C [J] .Y + . 1 , N-, C [POS] .Z) 
          J를 ++ ; 
    } 
    ANS = (최대 ANS 트리 [ . 1 ]을 .maxn - A [I]) 
}

       일부 세부 사항은 (너무 게으른 말을하지 않습니다 -.-

#INCLUDE <. 비트 / stdc ++ H>
 #DEFINE의 담당자 (I, A, n)에 대한 (INT 나 A =; I <= N; I ++)
 #DEFINE 당 (I, N, A)에 대한 (INT I = N; I> = A, 난 -)
 #DEFINE LL 긴 긴
 #DEFINE INT 긴 긴
 사용  스페이스 성병;
CONST LL INF (0x3f3f3f3f3f3f3f3fll);
CONST  INT INF ( 0x3f3f3f3f );
CONST  INT N = 1E6 + 150 ;
int로 A [N], 2 [N], N, M, K, TOT, INF = MI1, MI2 = INF;
구조체 트리 
{ 
    게요 L, R, 게으른, maxn; 
} 트리 [N << 2 ];
push_up (LL RT) 
{ 
    트리 [RT] .maxn = 최대 (트리 [RT << 1 ] .maxn, 트리 [RT << 1 | 1 ] .maxn); 
} 
공극 push_down는 (LL 길이 실온 것이다) 
{ 
    경우 (트리 [RT] .lazy) 
    { 
        트리 [RT를 << 1 ] + = .lazy 트리 [RT] .lazy; 
        트리 [RT << 1 | 1 ] + = .lazy 트리 [RT] .lazy; 
        트리 [RT << 1 ] + = .maxn 트리 [RT] .lazy; 
        트리 [RT << 1 | 1 ] + = .maxn트리 [RT] .lazy; 
        트리 [RT] .lazy = 0 ; 
    } 
} 
공극 빌드 (LL의 L, LL R, LL RT) 
{ 
    트리 [RT] .lazy = 0 , 트리 [RT] 펜닐 = L, 트리 [RT] .R = R;
    경우 (L == R) 
    { 
        트리 [RT] .maxn = - B [1];
        반환 ; 
    } 
    LL 미드 = (L +의 연구) >> 1 ; 
    빌드 (좌, 중, 실온 << 1 ); 
    빌드 (중간 + 1 , R, RT << 1 | 1  );
    push_up (RT);
} 
공극 update_range (LL의 L, LL R, LL 키 LL RT) 
{ 
    경우 (트리 [RT] .R <L || 트리 [RT] 펜닐> R)
         ;
    경우 (L <= 트리 [RT] 펜닐 && R> = 트리 [RT] .R) 
    { 
        트리 [RT] .maxn + = 키; 
        트리 [RT] .lazy + = 키;
        반환 ; 
    } 
    push_down (RT, 트리 [RT] .R - 트리 [RT] 펜닐 + 1 ); 
    LL 중간 = (트리 [RT] .R + 트리 [RT] 펜닐) >> 1 ;
    경우 (L <= MID) 
        update_range (L, R, 키 RT<< 1 );
    경우 (R> MID) 
        update_range (L, R, 키 RT << 1 | 1 ); 
    (RT) push_up; 
} 
구조체 노드 {
     INT X, Y, Z;
    부울  연산자 <( CONST 노드 a) CONST {
          X < AX; 
    } 
} C [N]; 
서명의 main () 
{ 
    는 scanf ( " % LLD % LLD LLD % " , 및 N, M, K); 
    렙 (I, 1 , N) 
    { 
        INT에서 볼때, 발;
        scanf와 ( " % LLD % LLD " , POS, 발);
        만약 A [POS = (a [POS]!) 브로;
        다른     A [POS = 분 (a [포스, 브로); 
        MI1 = 분 (MI1, 발), TOT는 = 최대 (TOT, POS)를; 
    } 
    렙 (I, 1 , m) 
    { 
        INT에서 볼때, 발; 
        scanf와 ( " % LLD % LLD " , POS, 발);
        만약 B [POS] = (B [POS]!) 브로;
        다른     B [POS = 분 (b [포스, 브로); 
        MI2 = 분 (MI2, 발);
    } 
    N = 0 ;
    (I, N 당 - 10 , 1 ) 
    { 
        경우 (! B [I]) (B) [I] = B [I + 1 ];
        다른  경우 (B [I + 1 ]) (B) [I] = 분 (b [I], B [I + 1 ]);
        만약 (! B [I] && N) N = I; 
    } 
    렙 (I, 1 , K)는 scanf ( " % LLD % LLD % LLD " , C [I] .x를, C [i]를 .Y, C [i]를 .Z); 
    정렬 (c + 1 , C + 1 + K);
    INT ANS = -mi1 - MI2, J = 1 ; 
    빌드 ( 1N, 1 ); 
    렙 (I, 1 , TOT) 
    { 
        경우 (a [I]) 
        { 
            동안 (j <= K && C [J] .x를 < I) 
            { 
                update_range (C [J] .Y + 1 , N, C [J ] .Z, 1 ); 
                J ++ ; 
            } 
            ANS = 최대 (ANS, 트리 [ 1 ] .maxn - A [I]); 
        } 
    } 
    의 printf ( " %의 LLD \ n " , ANS);
    반환  0  ;
}

 

 

 

 

추천

출처www.cnblogs.com/StarRoadTang/p/12400291.html