思路:這題一看就想到要用並查集做了,不過一看資料這麼大,感覺有點棘手,其實,我們仔細一想可以發現,我們需要記錄的是出現過的節點到根節點的1個奇偶性,這與區間端點的大小並沒有關係,於是想到我們可以用map對映即可,這樣就解決了大資料了。此外,如果0表示出現偶數個1,1表示出現奇數個1,然後就是向量偏移關係了(
1 #include2 #include3 #include4 #include5 #include6view codeusing
namespace
std;
7#define maxn 505089
intparent[maxn];
10int
kind[maxn];
11int
n,m,index;
1213
void
initiate()
1418 memset(kind,0,sizeof
(kind));19}
2021
int find(int
x)22
26int tmp=find(parent[x]);
27 kind[x]=(kind[x]+kind[parent[x]])%2;28
return parent[x]=tmp;29}
3031
bool union(int u,int v,int
d)32
38 parent[r1]=r2;
39 kind[r1]=(kind[v]-kind[u]+d+2)%2;40
return
true;41
}4243int
main()
4458
if(mp.find(b)==mp.end())
61if(!flag)continue;62
if(!union(mp[a],mp[b],d))66}
67if(flag)pos=m;
68 printf("
%d\n
",pos);69}
70return0;
71}7273
7475
7677
7879
poj1733 離散化 帶權並查集的思考
題意是給你乙個區間和區間1的個數是偶數還是奇數 然後判斷第乙個錯提問的 第一眼看到這題感覺是線段樹 思考一下線段樹的做法 線段樹維護區間資訊 維護乙個區間是奇數還是偶數 線段樹乙個節點代表乙個區間 但是乙個區間並不代表乙個節點 要多個節點儲存乙個資訊 多個交叉區間維護的話 就亂掉了 而且一般線段樹題...
poj1733 帶權並查集 map
開始看題目姿勢不對,然後發現是n的長度是1000000000不是串的長度,又發現輸出是最多符合前幾項 這類區間並查集都維護乙個權值終於感覺理解了,左區間需要 1 由於陣列開不下,但詢問只有5000條就可以用map存,hash不會。還是re因為初始化的時候不是for i,1,n 是for i,1,50...
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 與...