題解 history(離線並查集)

2022-02-19 19:12:09 字數 2495 閱讀 4655

*今天考試很水,ssw023道題都寫的正解,然而不注重細節。+1or-1寫成 |1 ,連通塊最大值不更新 , t3就是這道細節題 *

description

歷史學家小a正在研究乙個奇怪的王國的歷史。當前階段的任務是研究該國的交通。

根據這個奇怪的王國的史書記載,史書開始記載前這個王國有 n 個城市(城市從 0 開

始標號) ,但所有城市之間都沒有道路相連。

每一年,在位的國王會修建一條 x 到 y 的雙向道路,一條道路可能被修建多次,但不會

修建起點和終點為同乙個城市的道路。

而在這之間,國王會計畫進行若干次旅行。對於計畫進行的一次旅行 st->ed,如果當

時能完成這次旅行,而 t 年前不能完成這次旅行,那麼國王會對之前的建設成果感到滿意,

否則他會很生氣,並在下一次計畫旅行前都讓史官記錄下錯誤的修建道路的資訊,即把 x、

y 記作(x+n-c) mod n,(y+n-c) mod n。

當然在這些年中也發生了若干次國王的交替,初始國王的 c 值為 0,而每個國王的 c 值

不一定相同,但在國王在位期間 c 值不會改變,新上位的國王開始處於不生氣的狀態。

請根據史書幫助小 a 得出國王每次對於計畫旅行是否滿意,從而輔助小 a 能夠研究該

國的交通資訊。

input

第一行為兩個整數 n,m,表示初始城市數和歷史書記載的內容數。

接下來 m 行,每行是以下三種格式之一:

1 . k v :表示國王交替,新國王的 c 值為 v

2 . r x y:表示史書上記載的是國王修建了 x 到 y 的雙向道路,但注意這個記錄的可

能不是實際狀況。

3 . t st ed t: 表示國王計畫進行的一次 st->ed 的旅行, 且比較的是 t 年前的情況 (國

王可能會和史書開始記載以前的情況比較) ,注意這個記錄的肯定是實際情況。

注意只有遇到 r 操作才會使年份的計數+1。

output

輸出格式

輸對於每個 t 的記錄輸出一行, 如果此次計畫旅行令國王滿意, 則輸出 y, 否則輸出 x。

in.1

3 7r 0 1

t 0 1 1

k 1r 0 1

t 0 1 1

r 0 1

t 0 2 1

out.1yn

y資料範圍與約定

對於 30%的資料,保證 n<=1000 ,m<=3000。

另 30%的資料滿足沒有發生國王的交替。

對於 100%的資料,保證 n,m<=300000,0<=v,x,y,st,ed < n,0<=t< m。

由 yy儒 學長手寫的優質題解(ssw02只提供 法二 的** )

做法一:【資料結構優化暴力】

30%做法:由於只需要知道連通性,我們可以維護森林。有乙個比較好的暴力方法是,連邊時在邊上記錄這條邊連上的時刻,詢問時求兩點之間最遲的邊即可知道這兩個點連通的時刻,暴力複雜度o(nm),能拿到30%的分數。【這個思路很重要!】

100%做法:套上個lct即可。但由於資料範圍較大,可能需要優化常數,由於資料有梯度,具體分數根據**的醜陋程度而定。

ac code: 我寫的相當簡潔

#includeusing namespace std ;

const int maxn = 300005 ;

inline int read()

while(g>='0'&&g<='9')s=s*10+g-'0',g=getchar() ;return s*w ;

}int n , m , op[ maxn ][ 4 ] , fa[ maxn ] , c = 0 , now = 0 ;

int ask[ maxn ][ 4 ] , tot = 0 , rev[ maxn ] ; // x , y , t , 是否建好 ; rev反問

char s ;//k - 1 , r - 2 , t - 3 ->0 ;

bool kkk = false ;//是否發火

priority_queue< pair< int , int > >q ;// t , tot

void prepare()

else if( s == 'r' )

else if( s == 't' ) }}

inline int find( int x )

bool ask_( int x , int y )

inline void combin(int x,int y)

int main()

} if( op[ i ][ 0 ] == 3 )

else

} } return 0 ;

}

LCA Tarjin 並查集 離線

以前了解的tarjin演算法是用來求連通分量,在這裡是用來求最近公共祖先 並查集用過,很有意思的工具。kraskal演算法是並查集最經典的應用。首先初始化集合,每個元素為單個集合。集合,我們需要選出乙個代表,這個代表的性質是set u u。一開始乙個集合只有乙個元素,所以該集合的代表也就是該元素。當...

離線 並查集 Mootube

mootube 描述給定一顆n個節點的樹,定義兩點距離為他們之間路徑中邊權最小值。q次詢問k,v,詢問到v距離 k的點有多少 不含v 輸入第一行兩個整數n,q。接下來n 1行,每行3個整數u,v,w表示u,v之間有條路徑,長為w 接下來q組詢問,每組詢問2個整數k,v 輸出q行回答詢問 樣例輸入 4...

團夥 並查集 題解 並查集 搜尋

1 1270海戰 題目描述 在這個著名的遊戲中,在乙個方形的盤上放置了固定數量和形狀的船隻,每只船卻不能碰到其它的船。在這個題中,我們僅考慮船是方形的,所有的船隻都是由圖形組成的方形。編寫程式求出該棋盤上放置的船隻的總數。輸入輸入檔案頭一行由用空格隔開的兩個整數r和c組成,1 r,c 1000,這兩...