並查集 奇偶性(Parity)

2022-09-19 07:06:08 字數 1798 閱讀 7267

•有乙個

01序列,長度

<=1000000000,

現在有n條資訊

,每條資訊的形式是-

a b even/odd

。表示第

a位到第

b位元素之間的元素總和是偶數

/奇數。

•你的任務是對於這些給定的資訊,輸出第乙個

不正確的資訊所在位置

-1。資訊的數目不超過

5000。•

如果資訊全部正確,即可以找到乙個滿足要求的01

序列,那麼輸出n。

•輸入檔案

•第一行乙個整數m表示

01序列的長度,第二行乙個整數

n表示資訊的數目。

•接下來是

n條資訊

輸出第一條錯誤資訊的位置-1.

如果沒有錯誤資訊,則輸出n

10

51 2 even

3 4 odd

5 6 even

1 6 even

7 10 odd

3
這道題可以用並查集的思路做

將第三行資料的1 2看做半開半閉區間( 0 , 2 ]中的所有整數元素,他們的和是偶數,可將0當做2的父親,他們之間的距離為0(偶數mod2的餘數)

以此類推,如果為奇數,則他們之間的距離為1

那麼,輸入x和y,找到他們各自的父親g和h,如果g不等於h,則無需驗證,將g作為h的父親,其距離計算公式為:

s[ h ]=( s[ x ] + m - s[ y ] )%2

其中m為x到y的和的奇偶性(看不懂就慢慢想)

如果,g等於h,則進行驗證,看看abs( s[ x ] - s[ y ] )%2是否滿足此語句的奇偶性

整體思路到位

接下來,由於輸入的x和y最大為十億,無法開出這麼大的陣列,則必須將其理想化

由於只有5000條語句,所以元素最多只有10000個,則用陣列將輸入的x和y裝進去,要驗證的時候直接陣列裡面找,將其在陣列中的編號代替其本身進行運算

還不明白?看**吧:

[cpp]view

plain

copy

#include

#include

#include

#include

using

namespace

std;  

intabs(

intx)  

inta[10001];  

intf[10001],s[10001];  

intm,n,k;  

intfind(

intx)

//找父親與離父親的距離,順便找沿路所有元素與離父親的距離(看不懂?自己慢慢想)

intmain()  

if(x>y)swap(x,y);  

x--;//半開半閉區間,小的元素減減

bool

p=0,q=0;  

for(j=1;j<=k;j++)

//找陣列中是否有x和y

"white-space:pre"

>    

if(!p)a[++k]=x,x=k;

//沒有就將其加進去

if(!q)  

r1=find(x),r2=find(y);  

if(r1!=r2)  

else

//驗證

if(c[0]==

'e'&&abs(s[x]-s[y])%2)  

}  }  

printf("%d"

,n);  

}  

奇偶性剪枝

我們先來看一道題目 有乙個n x m大小的迷宮。其中字元 s 表示起點,字元 d 表示出口,字元 x 表示牆壁,字元,表示平地。你需要從 s 出發走到 d 每次只能向上下左右相鄰的位置移動,並且不能走出地圖,也不能走進牆壁。每次移動消耗1時間,走過路都會塌陷,因此不能走回頭路或者原地不動。現在已知出...

1085 判斷奇偶性

判斷奇偶性 time limit 1000ms memory limit 65536k total submit 128 accepted 58 description 計算乙個無符號整數x的二進位制中1的個數是奇數還是偶數。input 多組測試資料。每組測試資料報括乙個無符號整數n 0 n 2 3...

神奇的奇偶性原理

有如下一種遊戲 你找乙個人,請他從錢包裡抓取一把硬幣,隨意放在桌子上。然後你轉過身去。請對方任選幾個硬幣翻面,每一次翻面他都要說 翻面 最後,請他用手蓋住一枚硬幣,之後你轉過身來,檢視下桌面的硬幣,你就可以說出對方遮住的那枚硬幣是正面還是方面了!很神奇不是!這個遊戲利用的就是奇偶性原理與奇偶檢驗。在...