この質問は、ゲームが正しい解決策を考えるときであるが、それでも、実際には、タイムアウトの恐怖のために、やることはしなかったそのように簡単な互いに素セット+コンピューティングの組み合わせを後に。
ソリューション:
1.まず、私たちが知ることができない人について説明し、考慮すべき転送の関係は、プールに分割されています。
2.私たちは、組み合わせの数を計算する必要があるため、残りは、合併の集まりなので、また、記録された数のコレクションを見ることが必要です。
3。の説明推定する必要がある ANSを- =(a * b *表プレ- N *( - A) - Nのb *( - B)+ * b)は、 コードで推奨見ると
ANSの値aとbが組み込まれていないが、今とbがマージされた、そして我々は数aとbを減算する必要がある場合には、現在の値が組み合わせを寄付しました
だから、aとbの組み合わせの数に貢献するには、次のとおりです。男から1を取り、その後、Bから1人を取り、その後、コレクションの残りの部分から2人を選びます
コードは、a * b *表(二採取組み合わせの残りの組の数)であります
彼は前のコードは、「二つの異なる人々が借り取る」と述べています
:残りの二つの数は、収集が組み合わせで採取*(N - A) - - B×(N-- B)+ * Bをプレ
なぜあなたは(NA)はBに含まれているため、(NB)の中に含まれている、* bを追加したいんが、実際には、我々は再び追加する必要があり、二回* bを引きます。
#include <ビット/ STDC ++ H> 使用して名前空間STDを、 typedefを倍増DOU。 typedefの 長い長いLL。 typedefのペア < int型、int型 > PII。 マップのtypedef < int型、int型 > MII; #define PAI ACOS(-1.0) の#define M 100005で の#define INF 0x3f3f3f3f の#defineのmod十億七 の#defineインラインINに の#define K << 1左 の#define 1 |右のk << 1 の#define左LSONのL、ミッドを、 #define rsonミッド+ 1、R、右 の#define W(a)は(A) の#define lowbit(a)のA&( - A) の#define MS(B)のmemset(A、B、はsizeof(a)参照) #define ABS(A)(^(>> 31)) - (>> 31) の#define false_stdio IOS :: sync_with_stdio(偽)、cin.tie(0)、cout.tie(0) LL N、メートル; ANS、予め、A、B、FA、FB LL。 LLボス[M]、NUM [M]。 INT見つける(int型K){ 場合(ボス[K] == k)は戻りK。 他{ ボス[K] = (ボス[K])を見つけます。 戻りボス[K]。 } } int型メイン(){ false_stdio; CIN >> N >> M、 予め = N * - (N 1 /)2 ; // これは、nエミュレートされた2つの異なるヒト個体を取ることである ANS = N / 2 *(N - 1)/ 3。 *(N - 2)/ 4 *(N - 3); // C(4)の初期最大値(N) のための(INT I = 1 ; I <= N; I ++は){ / / 。始まる各セットは、唯一の数であるように1それら自身を認識していない NUM [I] = 1 ; BOSS [I] = I; } 用(INT I = 1 ; I <= M、Iが++ ){ COUT << ANS << ENDL; CIN >> A >> B; FA =(A)、FBは、(B)を探す=探す; // ルートを探します IF(ANS || FB FAが== == 0)続行 ; // コレクション、または答えが同じルートが、0まで低減することができない場合には、計算していない B = NUM [FA]をNUM = [FB]; // FBが設定数であるbのFAは、集合の数 // 3つの参照に戻ることができる。この説明を以下の読み取り ANSは、 - a * b *表(=プレ- * (N-- A) - B×(N-- B)+ *のB); プレ - = A * B; //及びbの組み合わせの数減算 ボス[FB] = FA; NUM [FA] + = NUM [FB]; } COUT << ANS << ENDL; 戻り 0 ; }