poj1733(區間上的種類並查集)

2021-09-06 13:00:59 字數 1322 閱讀 7888

題目大意是:乙個由0,1組成的數字串~~,現在你問乙個人,第i位到第j位的1的個數為奇數還是偶數。一共會告訴你幾組這樣的數

要你判斷前k組這個人回答的都是正確的,到第k+1組,這個人說的是錯的,要你輸出這個k,要是這個人回答的都是正確的,則輸出組數

odd為奇數,even為偶數。

sample input

10

51 2 even

3 4 odd

5 6 even

1 6 even

7 10 odd

sample output

3
思路:赤裸裸的種類並查集吧.......其中,我們把一段區間為奇數標記為0,為偶數標記為1,然後如果區間連貫,也就是說區間1到區間2,區間3到區間4,那麼就是可以連貫成區間1到區間4的,如此的話,可以是左極限-1,或者右極限+1......判斷是否在同乙個樹上,在的話,判斷是否正確,不在的話,連線起來,在連線的時候,按照種類並查集的操作即可.......

ac**:

#include#include#include#includeusing namespace std;

int father[50005],rank[50005],ans=0;

struct node

s[50005];

int t[50005],flag;

int cmp(const node a,const node b)

if(xxk)

rr=mid-1;

else

ll=mid+1;

}return rr;

}int main()

/*if(m==0)

*/int cnt=0;

for(int i=0; i0; i--)

if(t[i]!=t[i-1]+1) t[cnt1++]=t[i-1]+1;

sort(t,t+cnt1);

for(int i=cnt1; i>0; i--)

t[i]=t[i-1];

//for(int i=1; i<=cnt1; i++)

// printf("%d\t",t[i]);

int ans=m;

flag=1;

for(int i=0; i}

//for(int i=0;i<=n;i++)

//printf("%d\n",rank[i]);

printf("%d\n",ans);

}return 0;}/*

331 2 odd

2 3 odd

1 3 even

*/

poj1733 種類並查集 離散化

題意 輸入n表示有乙個長度為n的0,1字串,m表示接下來有m行輸入,接下來的m行輸入中x,y,even表示第x到第y個字元中間1的個數為偶數個,x,y,odd表示第x到第y個字元中間1的個數為奇數個,若m句話中第k 1是第一次與前面的話矛盾,輸出k 思路 若x,y之間1的個數為偶數個,那麼1 x 與...

poj1733 帶權並查集 map

開始看題目姿勢不對,然後發現是n的長度是1000000000不是串的長度,又發現輸出是最多符合前幾項 這類區間並查集都維護乙個權值終於感覺理解了,左區間需要 1 由於陣列開不下,但詢問只有5000條就可以用map存,hash不會。還是re因為初始化的時候不是for i,1,n 是for i,1,50...

poj 1733 帶權並查集 離散化

思路 這題一看就想到要用並查集做了,不過一看資料這麼大,感覺有點棘手,其實,我們仔細一想可以發現,我們需要記錄的是出現過的節點到根節點的1個奇偶性,這與區間端點的大小並沒有關係,於是想到我們可以用map對映即可,這樣就解決了大資料了。此外,如果0表示出現偶數個1,1表示出現奇數個1,然後就是向量偏移...