P6900 两份代码提交的编译选项、代码完全一致;
但一个 Wa on test 11
另一个 Wa on test 26
似乎没有 UB (?)
Windows环境,g++ 一查 UB 就报错
萌新在线求调代码、查 UB ,谢谢~
代码:
#include<bits/stdc++.h>
const double eps=1e-6;
using namespace std;
int calc(int a,int b)
{
return a*a+b*b;
}
vector<int>L,R;
const int N=205;
int Q[N][N],vis[N],pq[N];
int y[N],x[N];
int match(int cur )
{
for(int i=0,len=R.size();i<len;++i)
{
if(!vis[R[i]]&&Q[cur][R[i]])
{
vis[R[i]]=1;
if(!pq[R[i]])
{
pq[R[i]]=cur;
return 1;
}
else if(match(pq[R[i]]))
{
pq[R[i]]=cur;
return 1;
}
}
}
return 0;
}
int main()
{
int n,d;
cin>>n>>d;
for(int i=1;i<=n;++i)
{
cin>>x[i]>>y[i];
}
for(int i=1;i<=n;++i)
{
for(int j=i+1;j<=n;++j)
{
if(calc(x[i]-x[j],y[i]-y[j])>d*d)
{
Q[i][j]=Q[j][i]=1;
// cout<<"Add : "<<i<<" "<<j<<endl;
}
}
}
int ans=0;
vector<int>Ans;
Ans.clear();
for(int i=1;i<=n;++i)
{
for(int j=i+1;j<=n;++j)
{
if(calc(x[i]-x[j],y[i]-y[j])<=d*d)
{
// cout<<"solving : "<<i<<" "<<j<<endl;
double k=1.00*(y[i]-y[j])/(1.00*(x[i]-x[j]));
double b=y[i]-k*x[i];
L.clear(); R.clear();
for(int p=1;p<=n;++p)
{
if(p==i||p==j||(Q[i][p])||(Q[j][p])) continue;
if(((double)y[p]-(x[p]*k+b))>eps) L.push_back(p);
else R.push_back(p);
}
// cout<<"L : ";
// for(int p=0,len=L.size();p<len;++p)
// cout<<L[p]<<" "; puts("");
// cout<<"R : ";
// for(int p=0,len=R.size();p<len;++p)
// cout<<R[p]<<" "; puts("");
memset(pq,0,sizeof(pq));
memset(vis,0,sizeof(vis));
vector<int>fy; fy.clear();
fy.push_back(i);
fy.push_back(j);
int cnt=L.size()+R.size()+2;
for(int p=0,len=L.size();p<len;++p)
{
if(match(L[p])) --cnt;
else fy.push_back(L[p]);
}
for(int p=0,len=R.size();p<len;++p)
{
if(!pq[R[p]])
{
fy.push_back(R[p]);
}
}
// assert(fy.size()==cnt);
if(cnt>ans)
{
ans=cnt;
Ans=fy;
}
}
}
}
if(ans==0) {puts("1"); puts("1");return 0; }
printf("%d\n",ans);
for(int i=0,len=Ans.size();i<len;++i)
{
printf("%d ",Ans[i]);
}
puts("");
return 0;
}