トピックリンク:羅区
まず、我々は、出金動作の不在は、各列として見られるべきであり、点の各列(白ドット列の代わりに、行を表すと呼ばれるが黒点と呼ばれる)を検討し、各点$(x、y)は$みなしますエッジ。
操作は、実際に$ X_1 $行と$ Y_1、Y_2 $ユニコム列、とき$ X_2 $行と$ Y_1 $ユニコム、チャイナユニコムとも$ X_2 $ $ $ Y_2行の行の列で拡張します。
各リンクブロックの照会操作の偶数側+(黒ドット*ホワイトポイント数の数)が互いに素セットを使用することができるように、黒ドットと白ドットの同じブロック内ユニコムは、コントリビューションを生成しますメンテナンス。
今の時間についてのツリーラインの構築を検討「貢献」、$の中のすべてのエッジの同等の[のT_1、T_2] $この時、実際には、操作を引き出す検討し、$の[のT_1、T_2] $スプリットログ間隔は、その後、この範囲内の濃度は、このエッジの間隔を示して間隔をログエッジに対応するこれらのエッジに参加「貢献」を
$を、各時間間隔DFS場合、セグメントツリーDFS、次に、[のL、R] $は、側縁部に対応して設定されます終了する衝撃時間を排除するために、互いに素なセットを追加しました。
実際には、ほとんどの非償却時間データ構造が急速に引き出されるため、同様互いに素セット。あなたは、ランクによってマージを使用して、パス圧縮を使用することはできません。
時間複雑$(nは\ログ^ 2N)O $
1つの#include <ビット/ STDC ++ H> 2 の#define RINT INTレジスタ 3 の#define Fiの第 4 の#define SE第 5 の#define融点make_pair 6 使って 名前空間STDを、 7 typedefの長い 長いLL。 8のtypedef対< INT、INT > PII。 9 のconst int型 N = 600003 。 10 int型 Q、FA [N]、SIZ [N] [ 2 ]、トップ。 11マップ<PII、int型 >MA; 12ベクター<PII> VEC [N << 2 ]。 13の LL ANS、ansx [N]。 14インラインINT getfa(INT X){ 15 リターン X == FA [X]?X:getfa(FA [X])。 16 } 17 PII QUE [N]。 18インラインボイド櫛(int型のx、int型のY){ 19 、X = getfa(X)Y = getfa(Y)。 20 であれば(x == y)のリターン; 21 であれば(SIZ [X] [ 0 ] + SIZ [X] [ 1 ] <SIZ [Y] [ 0] + [Y] [ 1 ])スワップ(X、Y) 22の ANS + =(LL)[X] [ 0 ] * [Y]を[ 1 ] +(LL)[X] [ 1 ] * [Y] [ 0 ]。 23 [X] [ 0 ] + [Y] = [ 0 ]。 24 [X] [ 1 ] + [Y] = [ 1 ]。 25 のみ[Y] =のX。 26 QUE [++] = MP(X、Y) 28、27 } インラインボイドアンドゥ(int型のx、int型のY){ 29 のみ[y]は= yと、 30 もし[X] [ 0 ] - =あなた[Y] [ 0 ]。 31 あなた[X] [ 1 ] - =あなた[Y] [ 1 ]。 32の ANS - =(LL)あなたは、[X] [ 0 ] *あなた[Y] [ 1 ] +(LL)は、[X] [ 1 ] *あなた[Y] [ 0 ]。 33 } 34インラインボイド更新(int型のx、int型 LのINTの R、int型の L、int型のR、PIIヴァル){ 35 であれば(L <= L && R <= R){ 36 Vecを[x]はプッシュバック(プラーク) ; 37 リターン; 38 } 39 INTミッド= Lの+ R >> 1 。 40 であれば(L <= MID)更新(X << 1 、L、中間、L、R、ヴァル)。 41 であれば(MID <R)更新(X << 1 | 1、中間+ 1 、R、L、R、ヴァル)。 42 } 43のインラインボイド DFS(int型のx、int型の L、int型R){ 44 INT今= 頂。 45 のために(PII TMP:VEC [X]) 46 櫛(tmp.fi、tmp.se)。 47 もし(L == R)ansx [L] = ANS。 48 他に{ 49 int型ミッド= Lの+ R >> 1 。 50の DFS(X << 1、L、MID)。DFS(X << 1 | 1、ミッド+ 1 、R); 51 } 52 ながら(TOP> 今){ 53 アンドゥ(QUE [トップ] .fi、QUE [トップ] .SE)。- トップ; 54 } 55 } 56 INT メイン(){ 57 のscanf(" %dの"、&Q)。 58 用(RINT I =1 ; I <= Q; iは++ ){ 59 、INT X、Y。 60 のscanf(" %D%dの"、およびX&Y)。Y + = 3E5。 61 もし MA [MP(X、Y)=(ma.count(MP(X、Y))!)I。 62 他{ 63 更新(1、1、Q、MA [MP(X、Y)]、I - 1 、MP(X、Y))。 64 ma.erase(MP(X、Y))。 65 } 66 } 67 のための(自動それは(ma.begin =)を、それ= ma.end();!それ++ ) 68 更新(1、1、Q、それ- > SE、Q、それ- > FI)。 69 のために(RINT i = 1 ; iは= 3E5を<; I ++)は、FAを[i]は= I、SIZ [I] [ 0 ] = 1 ; 70 のためには、(RINT iは= 3E5 + 1 ; iは= 6E5を<; iは++)FA [I] = I、SIZ [I] [ 1 ] = 1 。 71の DFS(1、1 、Q)。 72 のために(RINT I = 1 ; I <= Q; iは++)のprintf(" %のLLDを\ n " 、ansx [I])。 73 }