评测灵异事件 (?)
  • 板块学术版
  • 楼主Monaco
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/7/22 21:49
  • 上次更新2023/10/27 18:51:04
查看原帖
评测灵异事件 (?)
236929
Monaco楼主2022/7/22 21:49

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; 
}
2022/7/22 21:49
加载中...