•有乙個
01序列,長度
<=1000000000,
現在有n條資訊
,每條資訊的形式是-
a b even/odd
。表示第
a位到第
b位元素之間的元素總和是偶數
/奇數。
•你的任務是對於這些給定的資訊,輸出第乙個
不正確的資訊所在位置
-1。資訊的數目不超過
5000。•
如果資訊全部正確,即可以找到乙個滿足要求的01
序列,那麼輸出n。
•輸入檔案
•第一行乙個整數m表示
01序列的長度,第二行乙個整數
n表示資訊的數目。
•接下來是
n條資訊
輸出第一條錯誤資訊的位置-1.
如果沒有錯誤資訊,則輸出n
1051 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...
神奇的奇偶性原理
有如下一種遊戲 你找乙個人,請他從錢包裡抓取一把硬幣,隨意放在桌子上。然後你轉過身去。請對方任選幾個硬幣翻面,每一次翻面他都要說 翻面 最後,請他用手蓋住一枚硬幣,之後你轉過身來,檢視下桌面的硬幣,你就可以說出對方遮住的那枚硬幣是正面還是方面了!很神奇不是!這個遊戲利用的就是奇偶性原理與奇偶檢驗。在...