No.74 貯金箱の退屈 - yukicoder
- union find を使った解法。
- 連結成分が確定した後に one の結果を連結成分に適用しないとダメ。(忘れて WA した。)
class BoredomOfSavingsBox {
public:
void solve(void) {
int N;
cin>>N;
UFTree uft(N);
vector<bool> one(N,false);
REP(i,N)
{
int d;
cin>>d;
int l = (1000*N+i-d)%N;
int r = (d+i)%N;
uft.unite(l,r);
if (l == r)
one[i] = true;
}
vector<int> num(N,0);
REP(i,N)
{
int w;
cin>>w;
num[uft[i]] += (w==0);
if (one[i])
one[uft[i]] = true;
}
REP(i,N)
{
if (uft[i] != i)
continue;
if (num[uft[i]]%2 && !one[uft[i]])
{
cout<<"No"<<endl;
return;
}
}
cout<<"Yes"<<endl;
}
};