1. 程式人生 > >【並查集】銀河英雄傳說

【並查集】銀河英雄傳說

題目描述

公元5801年,地球居民遷移至金牛座α第二行星,在那裡發表銀河聯邦創立宣言,同年改元為宇宙曆元年,並開始向銀河系深處拓展。

宇宙歷799年,銀河系的兩大軍事集團在巴米利恩星域爆發戰爭。泰山壓頂集團派宇宙艦隊司令萊因哈特率領十萬餘艘戰艦出征,氣吞山河集團點名將楊威利組織麾下三萬艘戰艦迎敵。楊威利擅長排兵佈陣,巧妙運用各種戰術屢次以少勝多,難免恣生驕氣。

在這次決戰中,他將巴米利恩星域戰場劃分成30000列,每列依次編號為1, 2, …, 30000。之後,他把自己的戰艦也依次編號為1, 2, …, 30000,讓第i號戰艦處於第i列(i = 1, 2, …, 30000),形成“一字長蛇陣”,誘敵深入。這是初始陣形。

當進犯之敵到達時,楊威利會多次釋出合併指令,將大部分戰艦集中在某幾列上,實施密集攻擊。合併指令為M i j,含義為讓第i號戰艦所在的整個戰艦佇列,作為一個整體(頭在前尾在後)接至第j號戰艦所在的戰艦佇列的尾部。顯然戰艦佇列是由處於同一列的一個或多個戰艦組成的。合併指令的執行結果會使佇列增大。

然而,老謀深算的萊因哈特早已在戰略上取得了主動。在交戰中,他可以通過龐大的情報網路隨時監聽楊威利的艦隊調動指令。 在楊威利釋出指令調動艦隊的同時,萊因哈特為了及時瞭解當前楊威利的戰艦分佈情況,也會發出一些詢問指令:C i j。該指令意思是,詢問電腦,楊威利的第i號戰艦與第j號戰艦當前是否在同一列中,如果在同一列中,那麼它們之間佈置有多少戰艦。

作為一個資深的高階程式設計員,你被要求編寫程式分析楊威利的指令,以及回答萊因哈特的詢問。 最終的決戰已經展開,銀河的歷史又翻過了一頁……

輸入

第一行有一個整數T(1≤T≤500,000),表示總共有T條指令。

以下有T行,每行有一條指令。指令有兩種格式:

1. M i j :i和j是兩個整數(1≤i , j≤30000),表示指令涉及的戰艦編號。該指令是萊因哈特竊聽到的楊威利釋出的艦隊調動指令,並且保證第i號戰艦與第j號戰艦不在同一列。

2. C i j :i和j是兩個整數(1i , j30000),表示指令涉及的戰艦編號。該指令是萊因哈特釋出的詢問指令。

輸出

你的程式應當依次對輸入的每一條指令進行分析和處理:

如果是楊威利釋出的艦隊調動指令,則表示艦隊排列發生了變化,你的程式要注意到這一點,但是不要輸出任何資訊;

如果是萊因哈特釋出的詢問指令,你的程式要輸出一行,僅包含一個整數,表示在同一列上,第i號戰艦與第j號戰艦之間佈置的戰艦數目。如果第i號戰艦與第j號戰艦當前不在同一列上,則輸出-1。

樣例輸入

 (如果複製到控制檯無換行,可以先貼上到文字編輯器,再複製)

4
M 2 3
C 1 2
M 2 4
C 4 2

樣例輸出

-1
1

提示

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
【分析】      非常經典的帶權並查集問題。      為表示方便,設f[]為該元素的父親,v[]為該元素到父親的距離,l[]為該列長度。      我們可以把每一艘戰艦看做一個元素。當合並a和b時,將a和b的祖先x和y搞出來 ,再將f[x]置為y,v[x]置為l[x]就行了。      查詢的時候,我們就可以將v[a]和v[b]算出來,然後輸出|v[a]-v[b]|-1。      注意:v[a]-v[b]可能為0,所以要進行特判。  【WA了很多遍的程式碼】
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 #include<cstdio> int set[30005], v[30005], l[30005]; int ab( int n) {      return n < 0 ? -n : n; } int f( int x) {      if (set[x] == x)          return x;      v[x] += v[set[x]], l[x] = l[set[x]];      return set[x] = f(set[x]); } int main()

相關推薦

銀河英雄傳說

題目描述 公元5801年,地球居民遷移至金牛座α第二行星,在那裡發表銀河聯邦創立宣言,同年改元為宇宙曆元年,並開始向銀河系深處拓展。 宇宙歷799年,銀河系的兩大軍事集團在巴米利恩星域爆發戰爭。泰山壓頂集團派宇宙艦隊司令萊因哈特率領十萬餘艘戰艦出征,氣吞山河集團點名將楊威利組

hdoj-1856-More is better

sub ont max ash cer careful gin search std More is better Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 327680/102400 K (Java/Ot

HDU1863_暢通projectPrim

計數 道路 不足 rim scanf article ava 能夠 else 暢通project Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja

CodeForces 776D The Door Problem

merge cnblogs 表示 turn pro name 所有 force mes CodeForces 776D The Door Problem【並查集】並查集 設 f 1--m 表示 開的情況 m+1--2*m 表示關的情況 對於每盞燈 如果他 是關

通暢工程(航電1232)

通過 統計 iostream clu 連接 tail efi pac des 轉自:http://blog.csdn.net/dellaserss/article/details/7724401/(並查集的講解非常有趣) Problem Description 某

團夥

() des stdin scrip blog -a main amp 產生 [codevs2597] 團夥 時間限制: 1 s 空間限制: 128000 KB 題目等級 : 黃金 Gold

枚舉Gym - 101243F - Vitamins

can inpu 大於 name clu pre () else if 指向 題意:有n片藥,有三種顏色,白色比紅色重,紅色比藍色重,給你一些它們之間的重量關系,比如1>3,2=4之類,問你它們的顏色,如果沒法判斷的輸出?。 先並查集把等於號全縮起來,然後按照大於號

進行 += solution ref 利用 ini html 是否 取值 模板 數組版: int parent[MAX_N]; int rank[MAX_N]; void Init(int n){ for(int i = 0; i < n; ++i){ pa

枚舉倍數UVALive - 7638 - Number of Connected Components

pre val 輸出 live ring algorithm ostream %d using 題意:n個點,每個點有一個點權。兩個點之間有邊相連的充要條件是它們的點權不互素,問你這張圖的連通塊數。 從小到大枚舉每個素數,然後枚舉每個素數的倍數,只要這個素數的某個倍數存在

poj 2236

proc cau pos exp con computer from size ble poj 2236 Description An earthquake takes place in Southeast Asia. The ACM (Asia Cooperated Me

CodeForces - 893C Rumor

ret problem force net blank code stdlib.h min strong 題目鏈接:https://vjudge.net/problem/CodeForces-893C 題目大意: 有n個人,其中有m對朋友,現在你有一個秘密你想告訴所

POJ - 1308 Is It A Tree?

ges sin 分享 ive ostream rep test case 圖片 air A tree is a well-known data structure that is either empty (null, void, nothing) or is a set

POJ-1456 Supermarket貪心+

max fff 優先 blank ack ket closed style 時間短 題目鏈接:http://poj.org/problem?id=1456 題目大意: 有N件商品,分別給出商品的價值和銷售的最後期限,只要在最後日期之前銷售處,就能得到相應的利潤,並且銷售

bzoj 1015: [JSOI2008]星球大戰starwar

const \n ans 聯通 ons zha stream for urn 又犯了zz的錯誤…… 需要註意的是,被毀掉的星球是不算一個聯通塊的(可能只有我這麽算吧= =) 離線下來時間倒流,就變成了向圖裏加星球,也就是用並查集維護聯通,在用tot變量記錄當前答案,每加一個

hdu1598 find the most comfortable road (枚舉)+

起點 efi super clas 更新 .net tput 即使 dci <題目鏈接> 題目大意: XX星有許多城市,城市之間通過一種奇怪的高速公路SARS(Super Air Roam Structure---超級空中漫遊結構)進行交流,每條SARS都對行駛

小X的液體混合

題目大意: 題目連結:http://10.156.17.250/JudgeOnline/showproblem?problem_id=2476 (學校內網) - 思路: 我們把每種液體看成一個節點,會發生反應的種液體之間連邊。那麼就會出現一張不一定連通的圖。 例如:

JZOJ5914盟主的憂慮LCABFS

題目大意: 題目連結:https://jzoj.net/senior/#main/show/5914 題目圖片: http://wx4.sinaimg.cn/mw690/0060lm7Tly1fwqalfjtaej30j20d2gm3.jpg http://wx3.sinaimg.c

JZOJ5177TRAVEL

題目大意: 題目連結:https://jzoj.net/senior/#main/show/5177 題目圖片: http://wx2.sinaimg.cn/mw690/0060lm7Tly1fwlxfazp5aj30g90fz77c.jpg http://wx2.sinaimg.c

Bailian1182 POJ1182 食物鏈

1182:食物鏈 描述 動物王國中有三類動物A,B,C,這三類動物的食物鏈構成了有趣的環形。A吃B, B吃C,C吃A。 現有N個動物,以1-N編號。每個動物都是A,B,C中的一種,但是我們並不知道它到底是哪一種。 有人用兩種說法對這N個動物所構成的食物鏈關係進行描述: 第一種說法是"1 X

POJ1611 The Suspects

The syn ssi separate div unit 還在 ide other The Suspects Time Limit: 1000MS Memory Limit: 20000K Total Submissions: 51969 Accept