HDU 3461 Code Lock(並查集)

2022-08-05 17:45:16 字數 1611 閱讀 1376

很好的一個題,思想特別6

題意:給你小寫字母個數n,每個字母可以向上翻動,例如:d->c,a->z。然後給你m對數(l,r)(l<=r),表示[l,r]之間可以同時向上翻動,且翻動後是相同的型別。問你最後可以出現多少種不同的型別。

例如:abcabc只給你[1,3],那麼abcabc==zababc(代表相同型別)

首先答案是是26^(n-m+k),而我們只需要找到k就好了。而k只能有一種情況才會出現,就是:[1,3]與[4,6]出現後[1,6]再出現,這樣k就加一個。而[1,3]與[3,6]出現後[1,6]出現,k不會加一(因為是區間關係)。這樣我們就離散化後,對[l-1,r]使用並查集就好。

#include#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define eps 1e-8

/*注意可能會有輸出-0.000

*/#define sgn(x) (x<-eps? -1 :x//

x為兩個浮點數差的比較,注意返回整型

#define cvs(x) (x > 0.0 ? x+eps : x-eps)//

浮點數轉化

#define zero(x) (((x)>0?(x):-(x))//

判斷是否等於0

#define mul(a,b) (a<#define dir(a,b) (a>>b)typedef

long

long

ll;typedef unsigned

long

long

ull;

const

int inf=1

<<28

;const

double pi=acos(-1.0

);const ll mod=1000000007

;const

int max=1010

;int

fat[max];

map mp;//

離散化struct

node

lock

[max];

void init(int

m)ll ftp(ll num,

intn)

return

sum;

}int find(int

x)int union(int x,int

y)ll solve(

int n,int

m)int

main()

int coun=0

;

for(map::iterator it=mp.begin();it!=mp.end();++it)

it->second=coun++;//

map離散化

printf("

%i64d\n

",solve(n,m));

}return0;

}

Code Lock HDU 3461

給定由n個字母組成的密碼鎖,如 abcdef 每一位字母都可以轉動,轉動該字母時,將變成它的下一個字母,如 a 轉動後是b x轉動後是y 接著給定m個區間,每次轉動給定區間內的所有字母,如密碼鎖 abcdef ,給定區間 1 3 轉動這個區間一次後變為 bcddef 題解 要是用並查集蒙的話,有可能...

hdu 1272 並查集

problem description 上次gardon的迷宮城堡小希玩了很久 見problem b ,現在她也想設計一個迷宮讓gardon來走。但是她設計迷宮的思路不一樣,首先她認為所有的通道都應該是雙向連通的,就是說如果有一個通道連通了房間a和b,那麼既可以通過它從房間a走到房間b,也可以通過它...

hdu 1272 並查集

hdu 1272 小希的迷宮 題意 判斷圖是否連通且無環 思路 輸入邊的兩點,若兩點的父節點相同,則存在環 只有一個根節點則圖連通 當輸入 0 0 時輸出 yes 1 include2 include3 4int set 100000 50 5 bool visit 100000 50 6 bool...