2009-05-30
SRM441 Div1 Easy: PerfectPermutation
Mediumを先に解いてたら分かったのかも・・・いや分からなかったかな
- isle(),summary()はMediumのような問題のために書いてみた
- これってcafelierさんのunion-findがやろうとしてる事かな
- グラフ系問題にもっと慣れないと駄目だ
#define sz(a) int((a).size())
#define rep(var,n) for(int var=0;var<(n);var++)
vector<int> isle(const vector<vector<bool> >& plan) {
/// vector<string> にすれば、YNが入ったやつも行ける
int n=plan.size();
vector<int> id(n,0); for(int i=0;i<n;i++) id[i]=i;
for (int i=0;i<n-1;i++) {
for (int j=i+1;j<n;j++) {
if (plan[i][j]) { /// plan[i][j]=='Y'とか
int idi=id[i],idj=id[j];
if (idi>idj) {
replace(id.begin(),id.end(),idi,idj);
} else if (idi<idj) {
replace(id.begin(),id.end(),idj,idi);
}
}
}
}
return id;
}
map<int,int> summary(const vector<int>& id)
{
map<int,int> s;
for(int i=id.size()-1;i>=0;i--){
if(s.find(id[i])==s.end()) s[id[i]]=1;
else s[id[i]]++;
}
return s;
}
class PerfectPermutation {
public:
int reorder(vector<int> P) {
int n=sz(P);
vector<vector<bool> > a(n,vector<bool>(n,false));
rep(i,n) a[i][P[i]]=a[P[i]][i]=true;
map<int,int> isles=summary(isle(a));
int s=sz(isles);
return (s==1)?0:s;
}
};
コメント
トラックバック - https://topcoder-g-hatena-ne-jp.jag-icpc.org/n4_t/20090530