poj 1733 map 帶權並查集 輸入坑點

2021-09-10 17:53:42 字數 1493 閱讀 8989

題意:只由0或1組成的長度為len的序列,先給出n個資訊,當給出第k個資訊與前k-1衝突的時候,認為有k-1個正確的資訊,假如全部不衝突,那麼有n個正確的資訊。資訊樣式為:1 2 even 表示第1個數字到第2個數字共有偶數個1,若是1 2 odd表示有奇數個1。資料範圍:len <=1e9 , n <= 5e3。

題解map帶權並查集

1.1e9的陣列沒法開,很容易想到了map。

2.具體map操作:先把所有資訊儲存起來,然後給這些端點排序。先把最小的端點對映為1,然後從小到大進行對映。但需要注意間隔不等,需視具體情況而定。給出3個測例如下:

測例1:

1 2 even

10 11 odd

1 11 even

測例2:

1 2 even

3 4 odd

1 4 even

測例3:

1 2 even

4 5 odd

1 5 even

假如將端點從小到大排序後,按從1開始,間隔為1的進行對映,這樣會把測例1對映為測例2,但這兩個測例的答案不同。應該對映為測例3,這樣相當於是給了原本相鄰端點對映為相鄰端點,原本不相鄰端點對映為不相鄰端點。

3.注意是半開半閉區間,例如給出1 2 even,實際用的是0 2 even,這樣可以保證區間直接相加。

4.套用帶權並查集模板即可。權值為0代表偶數個1,權值為1代表奇數個1。

5.注意相加模2操作等價於異或操作。

6.一直wa的原因是有輸入坑點len = 100,n = 0這種情況沒有考慮到,所以判斷條件寫錯了。

#include#include#include#include#include#include#define n 20005

using namespace std ;

bool flag ;

map map1 ;

struct node

node[n] ;

int n ;

int a[n] , b[n] , rela[n] ;

int hash[n] ;

int ans ;

void hash() }

}int find(int x)

void join(int x)

} else

else

}}int main()

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

sort(hash , hash + n * 2) ;

hash() ;

ans = n ;

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

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

}

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,然後就是向量偏移...

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

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