QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#618074#9434. Italian CuisineEmotion_ZWA 0ms5644kbC++173.5kb2024-10-06 18:34:052024-10-06 18:34:05

Judging History

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

  • [2024-10-06 18:34:05]
  • 评测
  • 测评结果:WA
  • 用时:0ms
  • 内存:5644kb
  • [2024-10-06 18:34:05]
  • 提交

answer

#include <bits/stdc++.h>

using namespace std;

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

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;
}

struct node{
    int x , y;
};

node A[ N ];
node B[ N ];

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;

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

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

    int d=abss( a1*sx + b1*sy + c1 );

    if( d>=r ) return true;

    d*=d;
    if( d>=r ) return true;

    int di=( a1*a1+b1*b1 );
    g=__gcd( di , d );
    d/=g , di/=g;

    r*=r;
    r*=di;

    if( d>=r ) 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;
        B[ i ]=A[ i ];
    }

    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: 0
Wrong Answer
time: 0ms
memory: 5644kb

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:

0
24
0

result:

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