題意: 輸入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 #include4 #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...