팔 지방 선거 시뮬레이션

A. 순서

디스커버리 메시지 후 유지하기 어렵습니다.

그래서 직접 블록의 유지 보수를 고려한다.

블록마다 벡터, 최대 순차적으로 촬영하는 모든 요소 벡터의 모든 요소를 ​​나타내는 블록을 연다.

최대은 본질로 간주하고,이 벡터의 요소 만 단조롭게 증가하는 부분을 유지해야한다.

쿼리와 폭력이 블록의 일부를 재구성 할 때, 직접 요소가 여러 번 업데이트되는 반으로 벡터를 확인할 수 있습니다.

메모리 카드 때문에, 모든 블록마다 5000 묻는 재건 폭력 때문에.

손 싼에 물었을 때 어느 상한선 울고, LOWERBOUND으로 표시.

1 #INCLUDE <. 비트 / stdc ++ H>
 2  #DEFINE 긴 긴 버리는
 3  사용  스페이스 성병;
4  CONST의  INT N = 1E5 + 7 ;
5  INT N, m, 평방;
6 A [N] LL, 추가 [ 700 ];
7  INT의 SZ [N], BL [N], 팀 [ 700 ];
8 벡터 <LL> 적이 [ 700 ];
9 인라인 공극 재 ( INT의 K) {
 10      의 경우 (! 팀 [K] && [K] .empty () 적이) 복귀 ; 
11      INT L = (K- 1) * 제곱 + 1 , R = 분 (N, K * 제곱);
(12)      에 대한이 ( INT 나 패 =; I <= R; ++ I) {
 13          SZ [I] + =은 [K] .END () 적이 - UPPER_BOUND (는 [K]를 적이) (.begin를 [K]를했습니다. 단부 ()와, [I]) + 팀 [K];
(14)          만약 A가 [I] = 최대 (a는 [I], [K]를 적이 .back ()) + (적이 [K] .empty ()!) 추가 [K];
15          다른 A [내가] + = 추가 [K];
16      }
 17      팀 [K]는 = 0 ; = [K]를 추가 0 ; 하는 명확한 () [K]를 없는데
18  }
 19 인라인 공극 수정 ( INT의 L, INT R, INT의 c) {
 20     만약 (! C를) 반환 ;
21      재 (BL [1]); 재건 (BL [연구]);
22       ( INT 나 L = 림 = 분 (BL [1] * 제곱, R) I <= LIM; I ++) ++ SZ [I], A [I] + = C;
23 일      경우 (BL [1] = BL [R]!)  ( INT I = (BL [R] - 1 ) * 제곱 + 1 ; I <= R; I ++) ++ SZ [I], A [I ] + = C;
24       ( INT I = BL [1] + 1 ; I <BL [R] ++ ⅰ) 추가 [I] = C +, ++ 팀 [I];
25  }
 26 인라인 공극 인서트 ( INT의 L, INT R, INT의 c) {
27      재 (BL [1]); 재건 (BL [연구]);
28       ( INT 나 L = 림 = 분 (BL [1] * 제곱, R) I <= LIM; I ++) 경우 (c>은 [I])는 [I] = C, ++ SZ [나는];
29 일      경우 (BL [1] = BL [R]!)  ( INT I = (BL [R] - 1 ) * 제곱 + 1 ; I <= R; ++ I) 의 경우 (C> A [I])를 [I] = C, ++ SZ [I];
30       ( INT I = BL [1] + 1 ; I <BL [R] ++ I)의 경우 (VE는 [I] .empty () || C 합산 [I]> 적이 [I] .back ( )) 적이 [I] .push_back (C- 추가 [I]);
31  }
 32 인라인 공극 쿼리 ( INTX) {
 33      INT의 k는 = BL [X]는;
34      의 경우 의 printf (([K] .empty () 적이!) " %의 LLD " 맥스 (a는 [X], [K]를 적이을 .back ()) + 추가 [K]);
35      사람 의 printf ( " %의 LLD " , A [X] + 추가 [K]);
36      의 printf ( " % D \ n " , SZ [X]는 +는 [K]를 적이 .END () - UPPER_BOUND (는 [K]를 적이) (.begin, [K]를 적이 .END ()와, [X]) + 팀 [K]);
37  }
 38 인라인 INT의 리드 (등록 INT X = 0 , 등록 문자 CH = getchar가 ()을 레지스터 INT F = 0) {
 39       (; isdigit에 (CH2 라!) = CH = CH == F getchar가 ()) ' - ' ;
40       (; isdigit에 (CH3) CH = getchar가 ()) = X (X << 1 ) + (X << 3 ) + (CH는 ^ 48 );
41      리턴 F - X : X;
42  }
 43  INT의 주 () {
 44      , N =) (판독; 평방 = SQRT (N) * 0.5 + 1 ;
45       ( INT 난 = 1 ; 나는 <= N; ++ ⅰ) [I] = () 읽기, BL [I] = (I- 1 ) / 평방 + 1 ;
46      M = () 판독;
47       ( 하는 int 난 = 1 , L, R, C 단계; I <= m; ++ I) {
 48          CHAR CH = getchar가 (); 반면 CH = (isalpha에 (CH2)!) getchar가 ();
(49)          만약 (CH2 == ' ' ) L = (판독), R = (판독), C = (L, R, C)의 변경) (판독;
(50) 그 밖의 경우 (CH2 == ' M ' ) L = (판독), R) (읽기, C = (), 인서트 (L, R, C)를 판독;
(51) 다른 쿼리 () (읽기);
52 의 경우 ((I &! 4095 )) 에 대한 ( INT J = 1 ; J <= BL [N] ++                            j)를 재 구축 (j);
53      }
 54      반환  0 ;
55 }
블록

폭력 병목 수정 시간 복잡도를 재구성 $ 복잡도 O (n \ SQRT {} nlogn) $이다.

재구성 각 블록 요소의 순서를 유지하면서 단조 포인터에서 발견 될 수 있고, 동작은 전체적인 복잡성 $의 O (n \ SQRT 않음) $ 병합 위해 수정 될 수있다.

긍정적 인 솔루션은 오프라인 주사선 동작 연습 할 수 있습니다.

각 작업은 삭제 왼쪽 지점 오른쪽 지점에 참여하는 것으로 간주됩니다.

그것은 쉽게 볼 수있는 다음 동작 A_1 $ \ M_1 \ A_2 \ M_2 \ A_3 \ M_3 $ 형태의 시퀀스로 변환하여 서로 인접하는 가산 동작.

고려는 원래 테이크 최대 합법적 인 작업을 유지하고, $ s_i $ 접두사 $ A_I $ 표현으로 설정합니다.

최대 동작하는 경우에만 M_ $ {I-1}를 s_i + - S_ {I-1} <$ M_i 설립 취할 수있다.

M_는 {I-1} {-s_를 I-1} <M_i-S_ {I} $ 너무 오래 유지로 $ M_i-s_i $ 단조롭게 증가하는 구조가 형성 전치 가능한 $.

이 점은 단조로운 스택 세그먼트 트리를 유지하는 아이디어를 유지 관리 할 수 ​​있습니다.

 

B. 여행 계획

하위 섹션은 긍정적 인 해결책을 생각하는 간단하지만 어렵다.

긍정적 인 솔루션은 아마 $ D $는 $ K $ 및 링크 내의 모든 블록의 우측을 GCD됩니다 걸릴.

확실한 대답은 단지 $ d 개 $의 배수가 될 수 있으며, 가장자리 괜찮 모든 $ K $ $ D $의 제거 얻을 수 있습니다.

이러한 경우가 그 하부 금형 블록 의미 합 $ K $ $ $ 1 링크 가중치 사방.

그러나, 단지 하나의 회로는 단지 링크 블록 후에 여러번 짝수 중 어느 측 (건축 방법은 트리의 비 회전 측 수있다 발생한 DFS 트리 거리에서 문제의 해결을 부여)되도록 구성 될 수있다.

그래서 $ 2 $ 루프 $ C $의 하형 $ K $으로 유의 비중에 생성이 가능하다.

$ K $으로 홀수 인 경우, 우리는 최종 답변은 $ 0 $입니다 그래서, $ u는이 경로를 $ 우측으로 향하는 화살표 U \ 우측으로 향하는 화살표 V를 \ 계속 복용 할 수 있습니다.

우리는 심지어 $ K $을 고려할 필요가있다.

지금 브이 $ 사이의 경로에서 짝수 (즉, 하부 다이 $ 2 $ $ $ 0 의미 함)의 길이가 있는지 \ $ U를 고려한다.

이미 회로 $ C $를 가지고 있기 때문에 경로 길이가 짝수가있는 경우, 대답은 확실히 $ 0 $입니다.

그렇지 않다면, 대답은 단지 $ 1 $가 될 수 있습니다.

그래서, 각 패리티 유니콤 염색의 각 블록 (기준 플롭 인접하지 않은 곳 물론 염색),이를인지 된 그래프를 판정한다.

그러나 문제는 각 $ K 주어진 $ 다른 점이다이 때문에 사전 처리를 할 수있는 방법은 없습니다.

그러나, 짝수는 여전히 주요 요인 $ K 원래의 $ 2 $ 유니콤 GCD $ 2 $ 블록에 비해 $ $ $의 수는 더 할 말을하는 것입니다, $ $ $ D를 한 후 이상 $ K 이외에 여기에 주목 .

직접 첨가가 가능하므로 전처리 유니콤 두 $ $ 다른 GCD 후의 패리티 우측 원래 블록은 동일하므로.

 

C. 해킹

각 경로를 보장 할 수 있습니다 찾을 수 있습니다 직접 최소한의 절단은 절단해야하지만 한 번만 컷을 보장 할 수 없습니다.

핸드 컷 플레이 상황 번 이상 발견 $ S $ / $ T $ 세트 각각 형성된 소스 싱크 동등하다 만족 $ T $ $ 메모리 뒷면 세트하면 $ 세트 S 후 죽었다.

문제 연습 용액 $ 뒷면 INF $로서 각각의 에지의 우측의 설정은, 상기 경우되도록 상기 합법적 절단되지 않도록, 경로 보강있을 것이다 주어진.

따라서, 최소 컷은 직접 실행.

추천

출처www.cnblogs.com/skyh/p/12204056.html