poj1733 種類並查集 離散化

2022-02-20 03:02:30 字數 1037 閱讀 5846

題意: 輸入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 與1~y中1的個數同奇偶性, 反之則異奇偶性, 我們可以將其理解為若輸入x, y, even, 即x, y屬於同種, 反之則屬於不同種,

用種類並查集就可以啦...不過要注意三點, 一是資料範圍1e9, 不能直接用做陣列下標, 要先離散化一下; 二是輸入的資料中x, y是閉區間, 不好處理, 我們可以將其化為半開區間來處理, (x-1, y] 或者 [x, y+1); 還有就是如果全部正確的話就輸出m(這裡wa了我好久~)....

**:

1 #include 2 #include 3 #include 

4 #include 5

#define maxn 5010

6using

namespace

std;78

int rank[2*maxn], pre[2*maxn];910

int find(int x)

16return

pre[x];17}

1819

int jion(int x, int y, int

d)else

28 }else

32return0;

33}3435

int main(void)44

for(int i=1; i<=m; i++)

51if(!mp[y])

54if(strstr(ch, "

even

"))else

59if(jion(mp[x-1], mp[y], d)&&!gg)62}

63if(!gg)

66 printf("

%d\n

", gg-1

);67

return0;

68 }

poj 1733 帶權並查集 離散化

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

poj1733 離散化 帶權並查集的思考

題意是給你乙個區間和區間1的個數是偶數還是奇數 然後判斷第乙個錯提問的 第一眼看到這題感覺是線段樹 思考一下線段樹的做法 線段樹維護區間資訊 維護乙個區間是奇數還是偶數 線段樹乙個節點代表乙個區間 但是乙個區間並不代表乙個節點 要多個節點儲存乙個資訊 多個交叉區間維護的話 就亂掉了 而且一般線段樹題...

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

題目大意是 乙個由0,1組成的數字串 現在你問乙個人,第i位到第j位的1的個數為奇數還是偶數。一共會告訴你幾組這樣的數 要你判斷前k組這個人回答的都是正確的,到第k 1組,這個人說的是錯的,要你輸出這個k,要是這個人回答的都是正確的,則輸出組數 odd為奇數,even為偶數。sample input...