https://vjudge.net/problem/HDU-3038
TT FFには見えない数字の文字列、書き込み
FF間隔(リピート動作)を選択し、TTこのセクションをしてからFFを、教え、そしてそれのいくつかは適切ではないので、これらの矛盾によると、いくつかの答えが矛盾しているあります間違った番号への答えを見つけます。
二つのことに注意してください:1を、そしてそれは前に与えられたと矛盾していない場合はTTは、正しいように。
2の後、FFは前とその後の分析と矛盾を発見し、もはや直接放棄され、関与しません。
ブログます。https://www.cnblogs.com/liyinggang/p/5327055.html
https://blog.csdn.net/yjr3426619/article/details/82315133?tdsourcetag=s_pcqq_aiomsg
まず、圧縮文言で正しい道を知っている必要があります:
INT(見つけるINT X){ 場合(!事前[X] = X){ int型、Y = [X]事前; [X]事前 = (予備[X])を見つけます。 和[X] + = 和[Y]。 } 戻り[X]を事前。 }
加重と検索とコレクションがあります。
[FA] =の事前FBと、
和[FA] = -sum [A] + S +和[B]。
私たちは、この質問の和[]配列は、その祖先ノードへの点からの距離を保持しているを使用しています。
右の親ノード点の値であり、各ノードディスジョイント・セットの処理、合計重み付け値によって
中間経路が圧縮を経験した場合、祖先重量を向けられています
所定の間隔LとRは同じであってもよいことに留意されたいが、L-テイクを堆積する際に、これを行うには互いに素設定データ構造を使用することはできません - またはR ++
#include <iostreamの> する#include <cstdioを> する#include <CStringの> する#include <ベクトル> の#include < ストリング > の#include < セット > の#include <地図> の#include <スタック> の#include <cmath> の#include <アルゴリズム> #include <キュー> の#define INF(1 << 30) 使用して 名前空間STDを、 const int型 MAXN = 2E5 + 7 。 int型の合計[MAXN]。 INT [MAXN]事前; X){ もし!(予備[X] = X){ int型、Y = 事前[X]。 [X]事前 = (予備[X])を見つけます。 和[X] + = 和[Y]。 } 戻り[X]を事前。 } int型のmain(){ int型、N M。 一方、(scanf関数(" %D%dの"!、&N、&M)= EOF){ ため(int型 I = 0 ; iが<= N + 1 ; iが++ ){ 事前[I] = I。 和[I] = 0 ; } INT FA、FB、B、S、ANS = 0 。 一方、(M-- ){ scanf関数(" %D%D%D "、&、&B、&S)。 B ++ ; FA = (A)を求めます。 FB = 検索(B)。 もし(FA == FB){ 場合(和[A] = S +は!合計[B]){ ANS ++ 。 } } 他{ プレ[FA] =のFB。 合計[FA]= -sum [A] + S +の和[B]。 } } のprintf(" %d個の\ n " 、ANS)。 } }