여름 학교 캠프 (아홉 번째 필드) 오프 이상 2019 소 E.All 남자 형제 (분리 된 세트 + 순열)입니다

질문의 의미가 지금 N 크기 (1)의 각 세트를 설정하는 것은 지금 당신은 당신이 출력의 집합을 병합 할 수 있습니다 각 당신에게 말할 것이다 m 시간의 집합을 병합 할 수 있습니다에 네 개의 다른 그룹에서 네 개의 각 프로그램에서 선택한 각 조합

아이디어는 : 우리는 합병 세트와 우리가 실제로 그 합병 전에 대답을 할 수 있습니다 숫자에 대한 시뮬레이션 프로그램의 집합으로 확인 생각할 수있는 결합 수 - 두 개의 컬렉션을 프로그램의 수 (자세한 내용은 코드를 이해하기 위해)

#INCLUDE <비트 / stdc ++ H.>
 사용  스페이스 성병;
CONST  이중 PI ACOS = (- 1.0 );
CONST의  INT N = 1E6 + 7 ;
CONST  INT INF = 0x3f3f3f3f ;
CONST   EPS 1e- = 6 ; 
타입 정의 부호없는  LL;
CONST LL 모드 1E7 + = 9 ; 
LL의 F [N], 크기 [N]; 
LL (LL의 X) {찾을 
    경우 의 (X! = F [X]) 
        [X] f를 = 찾기 (F [X]);
    반환 [X] F] 
} 
INT주 () { 
    IOS (:: sync_with_stdio 거짓으로 ) 
    cin.tie ( 0 ) cout.tie ( 0 ) 
    N- LL, m, CIN >> N- m, 
    LL ANS = (__ int128) (N- . 1 ) N- * / 2 * (N- 2 ) * (N-는 3. ) / 12이고 ; // 조합 수 
    에 대한 (LL I = 0 ; I는 N을 <; I ++ ) { 
        F [I] = I, 
        크기 [I] = . 1 ; 
    } 
    LL의 SUM = N-; // 기록 프로그램의 여러 개의 조합이 얼마나 (여기서는 반복) 
    COUT << << ANS "\ n ' ;
      (LL I = 1 ; I <= m; 내가 ++ ) { 
        LL의 X, Y, CIN >> X >> Y; 
        LL XX = 발견 (X) LL 증가한 = (y)를 찾아,
         경우 ( ! XX = YY) {  - = (크기 [XX] * 크기 [XX]);  - = (크기 [YY * 크기 [YY]); 
            LL TMP = 크기 [XX] * 사이즈 [YY] * ( (N 크기 [XX] - 크기 [YY]) * (N-크기 [XX] - 크기 [YY]) - 합) / 2 ] 
            [XX] f를 = YY, 
            크기 [YY] + = 크기 [XX] ; 
            합계 + = (크기 [YY * 크기 [YY]); 
            ANS - = TMP;            
        } 
        COUT << ANS << " \ 않음을 " ; 
    } 
    반환  0 ; 
}

 

추천

출처www.cnblogs.com/wmj6/p/11359841.html