QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#618130#9434. Italian CuisineEmotion_ZWA 0ms5636kbC++174.8kb2024-10-06 19:01:432024-10-06 19:01:43

Judging History

你现在查看的是最新测评结果

  • [2024-10-06 19:01:43]
  • 评测
  • 测评结果:WA
  • 用时:0ms
  • 内存:5636kb
  • [2024-10-06 19:01:43]
  • 提交

answer

#include <bits/stdc++.h>

using namespace std;

#define int long long
#define deg( x ) cout<<""#x"="<<x<<endl
#define endl '\n'
#define double long double

const int N=1e5+10;

int abss( __int128 x ){
    if( x<0 ) x=-x;
    return x;
}

istream &operator>>( istream &in , __int128 &n ){
    string s; in>>s;
    n=0;

    int f=1;
    int st=0;
    if( s[ 0 ]=='-' ) f=-1 , st=1;
    for( int i=st; i<s.size(); i++ ) n=n*10+s[ i ]-'0';
    n*=f;

    return in;
}

ostream &operator<<( ostream &out , __int128 n ){
    if( n==0 ){
        out<<0;
        return out;
    }

    string s;
    bool ok=false;
    if( n<0 ) ok=true , n=-n;
    while( n ){
        s+='0'+n%10;
        n/=10;
    }
    if( ok ) s+='-';
    reverse( s.begin( ) , s.end( ) );
    out<<s;
    return out;
}

int sta[ N ]; //数组模拟栈用来存凸包点集,第一个是1号点最后一个也是1号点;
int k=0; //栈的size;

struct node //结构体存点坐标;
{
    int x,y;
    friend bool operator<( const node& a , const node& b )//自定义排序;
    {
        if( a.x!=b.x ) return a.x<b.x;
        return a.y<b.y;
    }
} A[ N ];

node B[ N ];

int Cross( node a , node b , node c )//垂直向量法求相对方向;大于0在左,小于0在右,等于0共线;
{
    int te1x=a.y-b.y,te1y=b.x-a.x;
    int te2x=c.x-b.x,te2y=c.y-b.y;
    return te1x*te2x+te1y*te2y;
}

void andrew( int n )//n为总点数;
{
    k=0;
    sort( A+1 , A+1+n );//排序;
    for( int i=1; i<=n; i++ ){  //求下凸包;
        while( k>1 && Cross( A[ sta[ k-1 ] ] , A[ sta[ k ] ] , A[ i ] )<=0 ) k--;
        k++;sta[ k ]=i;
    }

    int te=k;
    for( int i=n-1; i>=1; i-- ){  //求上凸包;
        while( k>te && Cross( A[ sta[ k-1 ] ] , A[ sta[ k ] ] , A[ i ] )<=0 ) k--;
        k++;sta[ k ]=i;
    }
}

int cross( node a , node b , node c ){
    return ( b.x-a.x )*( c.y-a.y )-( b.y-a.y )*( c.x-a.x );
}

bool pan( int sx , int sy , int r , node a , node b ){
    if( cross( a , b , { sx , sy } ) <= 0 ) return false;

    double a1=( (double)b.y-(double)a.y ) , b1=( (double)a.x-(double)b.x ) , c1=( (double)b.x*(double)a.y-(double)a.x*(double)b.y );

//    int g=__gcd( a1 , __gcd( b1 , c1 ) );
//    a1/=g , b1/=g , c1/=g;

    double d=fabs( (double)a1*(double)sx + (double)b1*(double)sy + (double)c1 );
    double di=sqrt( ( (double)a1*(double)a1+(double)b1*(double)b1 ) );
//    int g=__gcd( di , d );
//    d/=g , di/=g;
    d/=di;
    
    d*=d;

    if( d-(double)r >= 1e-8 ) return true;
    return false;
}

void solve(){
    int n;
    cin>>n;

    int sx,sy,r;
    cin>>sx>>sy>>r;

    for( int i=1; i<=n; i++ ){
        cin>>A[ i ].x>>A[ i ].y;
    }

    andrew( n );
    n=k-1;
    for( int i=1; i<=n; i++ ){
        B[ i ]=A[ sta[ i ] ];
    }

    for( int i=1; i<=n; i++ ){
        A[ i ]=B[ i ];
    }

//    if( A[ 1 ].x==1978788055 ){
//        cout<<0<<endl;
//        return;
//    }

    cout<<"";
//    deg( n );
//    int idx=0;
//    A[ ++idx ]=B[ 1 ];
//    A[ ++idx ]=B[ 2 ];
//    for( int i=3; i<=n; i++ ){
//        if( cross( A[ idx-1 ] , A[ idx ] , B[ i ] )==(__int128)0 ) idx--;
//        A[ ++idx ]=B[ i ];
//    }
//
//    //deg( idx );
//    for( int i=1; i<=idx; i++ ){
//        cout<<A[ i ].x<<" "<<A[ i ].y<<endl;
//    }
//
//    if( cross( A[ idx ] , A[ 1 ] , A[ 2 ] )==0 ){
//
//        cout<<"gg"<<endl;
//        for( int i=1; i<idx; i++ ){
//            A[ i ]=A[ i+1 ];
//        }
//        idx--;
//    }
//    n=idx;


//    deg( cross( { 0,5 } , { 0,0 } , { 1,0 } ) );

//    deg( n );
//    cerr<<A[ 1 ].x<<" "<<A[ 1 ].y<<endl;

    //if( pan( sx , sy , r , A[ 1 ] , A[ 2 ] ) ) cout<<"gg"<<endl;

    int ans=0;
    int ne=1;
    int cnt=0;
    for( int i=1; i<=n; i++ ){
        if( ne==i ) ne=i+1;
        if( ne==n+1 ) ne=1;

        while( 1 ){
            if( pan( sx , sy , r , A[ i ] , A[ ne ] ) ){
                //cout<<i<<"->"<<ne<<endl;
                int di=ne-1;
                if( di==0 ) di=n;
                //cout<<"+"<<i<<" "<<di<<" "<<ne<<endl;
                //cout<<"++"<<cross( A[ i ] , A[ di ] , A[ ne ] )<<endl;
                cnt+=abss( cross( A[ i ] , A[ di ] , A[ ne ] ) );

                ne++;
                if( ne==n+1 ) ne=1;
            }
            else{
                ne--;
                if( ne==0 ) ne=n;
                break;
            }
        }

        //cout<<"结束"<<i<<" "<<cnt<<endl;

        ans=max( ans , cnt );
        int tt=i+1; if( tt>n ) tt=1;
        cnt-=abss( cross( A[ ne ] , A[ i ] , A[ tt ] ) );
        ne++; if( ne==n+1 ) ne=1;
    }

    cout<<ans<<endl;
}

signed main() {
//    ios::sync_with_stdio( 0 );
//    cin.tie( 0 ); cout.tie( 0 );

    int T=1;
    cin>>T;

    while( T-- ){
        solve();
    }

    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 5636kb

input:

3
5
1 1 1
0 0
1 0
5 0
3 3
0 5
6
2 4 1
2 0
4 0
6 3
4 6
2 6
0 3
4
3 3 1
3 0
6 3
3 6
0 3

output:

5
24
0

result:

ok 3 number(s): "5 24 0"

Test #2:

score: -100
Wrong Answer
time: 0ms
memory: 5560kb

input:

1
6
0 0 499999993
197878055 -535013568
696616963 -535013568
696616963 40162440
696616963 499999993
-499999993 499999993
-499999993 -535013568

output:

1238514776782540316

result:

wrong answer 1st numbers differ - expected: '0', found: '1238514776782540316'