P10248 解题报告
elbissoPtImaerD · · 题解
本题主要考察的知识点:【9】构造思想。
比较好写的线性做法。
不妨考虑那
extern "C" int*find_pairs(int m,int n,int u[],int v[]) {
int*ans=new int[n];
fill(ans,ans+n,-1);
const auto chk=[&](int i,int j) {
if(u[i]!=u[j]&&u[i]!=v[j]&&v[i]!=u[j]&&v[i]!=v[j]) {
ans[i]=j,ans[j]=i;
return true;
}
return false;
};
ve<int>b[2],p[2];
for(int i=1;i<n;++i) {
if(chk(0,i)) p[0].pb(i),p[1].pb(i);
else b[u[i]!=u[0]].pb(i),p[u[i]==u[0]].pb(i);
}
for(int _:{0,1}) if(p[_].size()) {
for(int i:b[_]) if(!chk(i,p[_][0])) {
for(int j:p[_]) if(chk(i,j)) break;
}
}
return ans;
}