題目大意是:乙個由0,1組成的數字串~~,現在你問乙個人,第i位到第j位的1的個數為奇數還是偶數。一共會告訴你幾組這樣的數
要你判斷前k組這個人回答的都是正確的,到第k+1組,這個人說的是錯的,要你輸出這個k,要是這個人回答的都是正確的,則輸出組數
odd為奇數,even為偶數。
sample input
10sample output51 2 even
3 4 odd
5 6 even
1 6 even
7 10 odd
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,然後就是向量偏移...