長度爲n的0和1組成的字符串, 然後問第L和R位置之間有奇數個1還是偶數個1.
根據這些回答, 判斷第幾個是錯誤(和之前有矛盾)的。
一旦發現有矛盾了,要馬上跳出循環, 後面的那些數據不用去管他了,否則如果用continue就WA。
#include <iostream>
#include <map>
#include <cstring>
using namespace std;
const int MAXX=10005;
int n,p,pre[MAXX],parity[MAXX];
map<int,int> numIndex; //離散化
int Find(int x)
{
if(pre[x]==-1)
return x;
int f=Find(pre[x]);
parity[x]=(parity[x]+parity[pre[x]])%2;
pre[x]=f;
return f;
}
bool Query(int x,int y,int odd)
{
int r1,r2;
r1=Find(x);
r2=Find(y);
if(r1==r2)
{
if((parity[x]+parity[y])%2==odd) return 1;
else return 0;
}
else{
pre[r1]=r2;
parity[r1]=(parity[x]+parity[y]+odd)%2;
return 1;
}
}
void Solve()
{
int i,x,y,index,idx1,idx2,odd;
char s[10];
cin>>n>>p;
index=0;
for(i=0;i<p;i++)
{
cin>>x>>y>>s;
x--;
if(numIndex.find(x)==numIndex.end())
numIndex[x]=index++;
idx1=numIndex[x];
if(numIndex.find(y)==numIndex.end())
numIndex[y]=index++;
idx2=numIndex[y];
if(strcmp(s,"odd")==0) odd=1;
else odd=0;
if(Query(idx1,idx2,odd)==false) break;
}
cout<<i<<endl;
}
void Init()
{
memset(pre,-1,sizeof(pre));
}
int main()
{
Init();
Solve();
// system("pause");
return 0;
}
URAL上的AC代碼:
#include <iostream>
#include <map>
#include <cstring>
using namespace std;
const int MAXX=10005;
int n,p,pre[MAXX],parity[MAXX];
map<int,int> numIndex; //離散化
int Find(int x)
{
if(pre[x]==-1)
return x;
int f=Find(pre[x]);
parity[x]=(parity[x]+parity[pre[x]])%2;
pre[x]=f;
return f;
}
bool Query(int x,int y,int odd)
{
int r1,r2;
r1=Find(x);
r2=Find(y);
if(r1==r2)
{
if((parity[x]+parity[y])%2==odd) return 1;
else return 0;
}
else{
pre[r1]=r2;
parity[r1]=(parity[x]+parity[y]+odd)%2;
return 1;
}
}
int main()
{
while(cin>>n&&n!=-1)
{
memset(pre,-1,sizeof(pre));
memset(parity,0,sizeof(parity));
numIndex.clear();
int i,x,y,index,idx1,idx2,odd;
char s[10];
cin>>p;
index=0;
for(i=0;i<p;i++)
{
cin>>x>>y>>s;
x--;
if(numIndex.find(x)==numIndex.end())
numIndex[x]=index++;
idx1=numIndex[x];
if(numIndex.find(y)==numIndex.end())
numIndex[y]=index++;
idx2=numIndex[y];
if(strcmp(s,"odd")==0) odd=1;
else odd=0;
if(Query(idx1,idx2,odd)==false) break;
}
for(int ii=i+1;ii<p;ii++)
{
cin>>x>>y>>s;
}
cout<<i<<endl;
}
// system("pause");
return 0;
}