連續攻擊遊戲 遞增1 題解 並查集

2022-04-12 06:01:55 字數 1439 閱讀 4217

lxhgww最近迷上了一款遊戲,在遊戲裡,他擁有很多的裝備,每種裝備都有2個屬性,這些屬性的值用[1,10000]之間的數表示。當他使用某種裝備時,他只能使用該裝備的某乙個屬性。並且每種裝備最多只能使用一次。 遊戲進行到最後,lxhgww遇到了終極boss,這個終極boss很奇怪,攻擊他的裝備所使用的屬性值必須從1開始連續遞增地攻擊,才能對boss產生傷害。也就是說一開始的時候,lxhgww只能使用某個屬性值為1的裝備攻擊boss,然後只能使用某個屬性值為2的裝備攻擊boss,然後只能使用某個屬性值為3的裝備攻擊boss……以此類推。 現在lxhgww想知道他最多能連續攻擊boss多少次?

輸入的第一行是乙個整數n,表示lxhgww擁有n種裝備 接下來n行,是對這n種裝備的描述,每行2個數字,表示第i種裝備的2個屬性值

輸出一行,包括1個數字,表示lxhgww最多能連續攻擊的次數。

3

1 23 2

4 5

2
hint

【資料範圍】

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

對於100%的資料,保證n < =1000000

驚......這道題用並查集做......

用通俗的話說,主要思路就是把1~n個權值列出來,遍歷**時,將**的兩個屬性權值連一條無向邊.

也就是說**是邊,兩個屬性是點.

這期間並查集就是維護連通性用的.最後我們會得到一棵樹(無環)或乙個有環圖.(當然也可能是多個,但結果只能是其中含有1的乙個,我們會用乙個全域性變數vis來從1遍歷),並且這棵樹(或圖)中的點全都是遞增的,就比如m,m+1,m+2......

對於一棵無環的樹如果權值個數為x,用目前的**一定能滿足連續取到x-1個屬性.每條邊都取他前面的那個點權,自己畫一畫就可以.

對於乙個圖權值個數為x,則用目前的**一定可以取到這全部的x個遞增的屬性,和上面類似,只不過有一條邊騰出空來能取到某條邊所連線的的後面的那個節點,是這條騰出空來的邊以後的邊每次都能取所連線的後面的節點,一直到第x個.(當然如果有很多騰出空來的邊,取到這x個屬性就更顯然了)

我們可以把這些能取到的屬性做標記,最後從1遍歷.

我的**中給兩點連邊和做vis標記是同時的,可能有點繞,詳見**解釋.

#include #include #include #include using namespace std;

const int maxn=1e6+5;

int n,f[maxn];

bool vis[maxn];

int find_root(int x)

void sw(int &a,int &b)

void mg(int x,int y){

if(x當然還有一種做法是二分圖,剛才才看到,大家可以搜一搜......

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

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

初學並查集 並查集1

現在,我是用乙個初學者的眼光來寫並查集,此文最初寫於我學並查集的那天,後經過多次修改。1 並查集是什麼 並查集是乙個具有多個連通分支的圖,他擁有合併兩個連通分支,和查詢兩個元素是否位於同乙個連通分支的功能。2 並查集的簡單應用 並查集解決什麼問題 假如有一些點,你知道哪些點是直接相連的,但實際上間接...

題解 造船(並查集

傳送門 設1為危險,0為安全 思路 和並查集有關係,對於一些可以用並查集連在一起的船的編號的集合,我們可以保證其最多只有根節點為1 設f la g x flag x flag x 為xx x的狀態 首先,任意一點都為1,且都為根節點。然後在x xx,y yy中選乙個加一,設x,y的根節點為u,v 當...