PTA_2020模拟赛_L2-4 秀恩爱分得快 (25 分)_细节模拟_TLE处理

// 25' AC
#include<bits/stdc++.h>
using namespace std;

const int N=1111;
vector<int> vv[N];
double in[2][N];
int sex[N];

set<int> st1,st2;
set<int>::iterator it; 

int read()			// 特殊处理 -0 
{
    int ans=0,f=1;
    char ch=getchar();
    while( !( ch>='0' && ch<='9' ) )
    {
        if( ch=='-' ) f=-1;
        ch=getchar();
    }
    while( ch>='0' && ch<='9' )
    {
        ans=( ans<<1 )+( ans<<3 )+( ch-'0' );
        ch=getchar();
    }
    sex[ans]=( f==1?1:0 );
    return ans;
}

int main()
{
	double tt;
	int n,m,i,j,k,a,b,f1,f2;
	
    while( cin>>n>>m )
    {
        for( i=0;i<m;i++ )
        {
            cin>>k;     		// 记得调大小 
            vv[i].resize(k);		
            for( j=0;j<k;j++ ) vv[i][j]=read();
        }
        a=read(); b=read();

        for( i=0;i<m;i++ )              // 只算有效的数据 不然会 TLE! 
        {                              	// vector not v.find()     		
			if( find( vv[i].begin(),vv[i].end(),a )!=vv[i].end() )
                for( j=0;j<vv[i].size();j++ )
                {
                    if( vv[i][j]==a ) continue;
                    in[0][vv[i][j]]+=(double)1/vv[i].size();
                }
            if( find( vv[i].begin(),vv[i].end(),b )!=vv[i].end() )
                for( j=0;j<vv[i].size();j++ )
                {
                    if( vv[i][j]==b ) continue;
                    in[1][vv[i][j]]+=(double)1/vv[i].size();
                }
        }			// 【vv[i][j]】   +=
		
		f1=f2=0;	// 忘记初始化. 
		
        tt=0; st1.clear();
        for( i=0;i<n;i++ )          // 算 pa_max
        {
            if( i==a ) continue;
            if( in[0][i]>tt && sex[a]+sex[i]==1 )
            {                                            //
                st1.clear(); tt=in[0][i]; st1.insert( i );
            }
            else if( in[0][i]==tt && sex[a]+sex[i]==1 )
            {
                st1.insert( i );
            }
        }
        if( st1.find(b)!=st1.end() ) f1=1;

        tt=0; st2.clear();
        for( i=0;i<n;i++ )          // 算 pb_max
        {
            if( i==b ) continue;
            if( in[1][i]>tt && sex[b]+sex[i]==1 )
            {
                st2.clear(); tt=in[1][i]; st2.insert( i );
            }
            else if( in[1][i]==tt && sex[b]+sex[i]==1 )
            {
                st2.insert( i );
            }
        }
        if( st2.find(a)!=st2.end() ) f2=1;

        if( f1+f2==2 )          // 彼此亲密度最高
        {                       // ==0 "-"
            if( sex[a]==0 ) cout<<"-"; cout<<a<<" ";
            if( sex[b]==0 ) cout<<"-"; cout<<b<<endl;
            continue;
        }				// 样例都检查一遍 

        for( it=st1.begin();it!=st1.end();it++ )
        {
            if( sex[a]==0 ) cout<<"-";      cout<<a<<" ";
            if( sex[(*it)]==0 ) cout<<"-";  cout<<(*it)<<endl;
        }
        for( it=st2.begin();it!=st2.end();it++ )
        {
            if( sex[b]==0 ) cout<<"-";      cout<<b<<" ";
            if( sex[(*it)]==0 ) cout<<"-";  cout<<(*it)<<endl;
        }
    }
    return 0;
}

// 17' 算出所有关系会 TLE
#include<bits/stdc++.h>
using namespace std;

const int N=1111;
double in[N][N];
int sex[N];

vector<int> v;
set<int> st1,st2;
set<int>::iterator it;

int main()
{
    stringstream ss;
    string s;
    double tt;
    int n,m,k,i,j,a,b,id,f1,f2;

    while( cin>>n>>m )
    {
        memset( in,0,sizeof( in ) );
        memset( sex,0,sizeof( sex ) );

        while( m-- )
        {
            cin>>k; v.clear();

            for( i=0;i<k;i++ )
            {
                cin>>s;
                ss.clear(); ss.str("");
                ss<<s; ss>>id;				// 命名冲突修改了变量值 

                id=abs( id );
                if( s[0]=='-' ) sex[id]=0;
                else            sex[id]=1;
                v.push_back( id );
            }
            for( i=0;i<v.size();i++ )           // 上次只加了一个人的
                for( j=i+1;j<v.size();j++ )
                {
                    in[v[i]][v[j]]+=(double)1/k;	// v[i] 不是 i 本身 !!! 
                    in[v[j]][v[i]]+=(double)1/k;
                }
        }
        cin>>a; a=abs( a );
        cin>>b; b=abs( b );
        f1=f2=0;

        tt=in[a][b]; st1.clear();       // pa
        for( i=0;i<n;i++ )
        {
            if( i==a ) continue;
            if( in[a][i]>tt && sex[a]+sex[i]==1 )
            {
                st1.clear(); tt=in[a][i]; st1.insert( i );
            }
            else if( in[a][i]==tt && sex[a]+sex[i]==1 )
            {
                st1.insert( i );
            }
        }
        if( st1.find( b )!=st1.end() ) f1=1;

        tt=in[a][b]; st2.clear();       // pb
        for( i=0;i<n;i++ )
        {
            if( i==b ) continue;
            if( in[b][i]>tt && sex[b]+sex[i]==1 )
            {
                st2.clear(); tt=in[b][i]; st2.insert( i );
            }
            else if( in[b][i]==tt && sex[b]+sex[i]==1 )
            {
                st2.insert( i );
            }
        }
        if( st2.find( a )!=st2.end() ) f2=1;

        if( f1+f2==2 )
        {
            if( sex[a]==0 ) cout<<"-"; cout<<a<<" ";
            if( sex[b]==0 ) cout<<"-"; cout<<b<<endl;
            continue;
        }
        
        for( it=st1.begin();it!=st1.end();it++ )        // pa
        {
            if( sex[a]==0 ) cout<<"-";     cout<<a<<" ";
            if( sex[(*it)]==0 ) cout<<"-"; cout<<(*it)<<endl;
        }
        for( it=st2.begin();it!=st2.end();it++ )        // pb
        {
            if( sex[b]==0 ) cout<<"-";     cout<<b<<" ";
            if( sex[(*it)]==0 ) cout<<"-"; cout<<(*it)<<endl;
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_63173957/article/details/124156957