긴 시간은 블로그 물을 작성하지 않은 ,,,
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 ; }