計蒜客 接龍

2021-08-29 20:56:21 字數 1638 閱讀 8208

初見安~這裡是第一次摸並查集。

蒜頭君在玩一種接龍的遊戲,蒜頭君有 3000030000 張卡片分別放在 3000030000 列,每列依次編號為 1,2,...,300001,2,...,30000。同時,蒜頭君也把每張卡片依次編號為 1,2,...,300001,2,...,30000。

遊戲開始,蒜頭君讓讓第 ii 張卡片處於第 i(i = 1,2,...,30000)i(i=1,2,...,30000) 列。然後蒜頭君會發出多次指令,每次調動指令 mm ii jj 會將第 ii 張卡片所在的佇列的所有卡片,作為乙個整體(頭在前尾在後)接至第 jj 張卡片所在的佇列的尾部。

蒜頭君還會檢視當前的情況,發出 cc ii jj 的指令,即詢問電腦,第 ii 張卡片與第 jj 張卡片當前是否在同乙個佇列中,如果在同一列中,那麼它們之間一共有多少張卡片。

聰明的你能不能編寫程式處理蒜頭君的指令,以及回答蒜頭君的詢問呢?

第一行有乙個整數 tt(1\leq t\leq 5000001≤t≤500000),表示總共有 tt 條指令。

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

mm ii jj:ii 和 jj 是兩個整數(1\leq i, j\leq 300001≤i,j≤30000),表示指令涉及的卡片編號。你需要讓第 ii 張卡片所在的佇列的所有卡片,作為乙個整體(頭在前尾在後)接至第 jj 張卡片所在的佇列的尾部,輸入保證第 ii 號卡片與第 jj 號卡片不在同一列。

cc ii jj:ii 和 jj 是兩個整數(1\leq i, j\leq 300001≤i,j≤30000),表示指令涉及的卡片編號。該指令是蒜頭君的詢問指令。

如果是蒜頭君調動指令,則表示卡片排列發生了變化,你的程式要注意到這一點,但是不要輸出任何資訊;

如果是蒜頭君的詢問指令,你的程式要輸出一行,僅包含乙個整數,表示在同一列上,第 ii 號卡片與第 jj 號卡片之間的卡片數目(不包括第 ii 張卡片和第 jj 張卡片)。如果第 ii 號卡片與第 jj 號卡片當前不在同乙個佇列種中,則輸出 -1−1。

4

m 2 3

c 1 2

m 2 4

c 4 2

-1

1

可以說是並查集裸題了——邊帶權系列裸題。在並查集的基礎上查詢是否在同一列是很簡單的,但是兩張牌之間的距離求法就需要開乙個陣列d來維護;同時我們可以發現:改變裡面的值——即在合併時,我們需要兩個集合的大小,所以再開乙個size陣列。

下面是**及詳解——

#include#define n 30005

using namespace std;

int fa[n],d[n],size[n];

int n;

int get(int x)

void merge(int x,int y)

int main()

for(int i=1;i<=n;i++)

{ char a;

cin>>a;

int x,y;

cin>>x>>y;

if(a=='m') merge(x,y);

else

{ int tx=get(x);

int ty=get(y);

if(tx==ty) cout《迎評:)

——end——

計蒜客 2019計蒜之道D

題意 現在給定你乙個字串 s ss 以及乙個整數 k kk,請求出 s ss的字典序最小的長度為 k kk的子串行。資料範圍 0 s 5000000 00 s 5000 000 樣例輸入 helloworld 5樣例輸出 ellld思路 假如我們先不考慮長度為k的限制我們應當怎麼做?我們以樣例為例子...

計蒜客 解碼

蒜頭君自己發明了一種字串的編碼方式,對於只含有大小寫字母的字串,可以用數字來表示括號裡面的串連續出現的次數 數字有可能超過一位數 比如a abcd 2等價於aabcdabcd。特別地,如果數字前面沒有括號,表示緊貼數字的前面的 乙個字母 出現的次數。比如abc2表示abcc。為了降低解碼的難度,蒜頭...

計蒜客 郊遊

蒜頭君成為了計蒜客附屬幼兒園的一名老師,乙個陽光明媚的週末,蒜頭君帶領著小朋友們去野外郊遊。一共有 2n2n 個小朋友,正好是 n n 個男孩和 n n 個女孩。蒜頭君讓小朋友分組玩遊戲,每組乙個男孩和乙個女孩,但是有些女孩比較討厭某些男孩,不願意和他們分在一組,男孩覺得和誰分在一組都無所謂。你能告...