QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#640417#9434. Italian CuisineDixiky_215TL 45ms11532kbC++204.3kb2024-10-14 12:09:462024-10-14 12:09:46

Judging History

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

  • [2024-10-14 12:09:46]
  • 评测
  • 测评结果:TL
  • 用时:45ms
  • 内存:11532kb
  • [2024-10-14 12:09:46]
  • 提交

answer

#include <bits/stdc++.h>

using namespace std;
using ll = long long;
const double eps=1e-11;
const int MAXN=5e5+7;                                                         
struct Point{                                                                        
    ll x,y;                                                                      
    Point(ll x=0,ll y=0):x(x),y(y){}
};
typedef Point Vector;

Vector operator + (Vector A,Vector B){return Vector(A.x+B.x,A.y+B.y);}
Vector operator - (Vector A,Vector B){return Vector(A.x-B.x,A.y-B.y);}
Vector operator * (Vector A,ll B){return Vector(A.x*B,A.y*B);}
Vector operator / (Vector A,ll B){return Vector(A.x/B,A.y/B);}

int dcmp(ll x){if(x==0)return 0;return (x>0)?1:-1;}
bool operator == (const Vector A,const Vector B){
    return dcmp(A.x-B.x)==0 && dcmp(A.y-B.y)==0;
}
ll Dot(Vector A,Vector B){return A.x*B.x+A.y*B.y;}                     
ll Cross(Vector A,Vector B){return A.x*B.y-B.x*A.y;}              

ll ComputePolygonArea(vector<Point> &points)
{
    int point_num = points.size();
    if(point_num < 3)return 0.0;
    ll s = points[0].y * (points[point_num-1].x - points[1].x);
    for(int i = 1; i < point_num; ++i)
        s += points[i].y * (points[i-1].x - points[(i+1)%point_num].x);
    return s;
}
Point a[MAXN],be;
vector<Point> c;
int t;
int n;
ll be_x,be_y,r;
ll Distance(Point p,Point a,Point b)
{
    Vector v1=b-a,v2=p-a;
    return fabs(Cross(v1,v2));
}
bool check(Point P,Point A,Point B){
    if(A==B) return 1;
    Vector v1=B-A,v2=P-A,v3=P-B;
    if(dcmp(Dot(v1,v2))<0)
    {
        __int128 k2=Dot(v2,v2);
        if(k2>=r*r) return 1;
        return 0; 
    }          
    else if(dcmp(Dot(v1,v3))>0)
    {
        __int128 k3=Dot(v3,v3);
        if(k3>=r*r) return 1;
        return 0; 
    }    
    else
    {
        __int128 k1=Dot(v1,v1);
        __int128 sss=Cross(v1,v2);
        
        sss=sss*sss;
        __int128 rk=r;
        k1=k1*rk*rk;
        if(sss>=k1) return 1;
        return 0;
    }
}
// bool check(Point P,Point A,Point B){
//     if(A==B)return 1;
//     Vector v1=B-A,v2=P-A,v3=P-B;
//     if(dcmp(Dot(v1,v2))<0)
//     {
//         if(Length(v2)>r||fabs(Length(v2)-r)<=eps) return 1;
//         return 0; 
//     }          
//     else if(dcmp(Dot(v1,v3))>0)
//     {
//         if(Length(v3)>r||fabs(Length(v3)-r)<=eps) return 1;
//         return 0;
//     }    
//     else
//     {
//         if(fabs(Cross(v1,v2))>r*Length(v1)||fabs(fabs(Cross(v1,v2))-r*Length(v1))<=eps) return 1;
//         return 0;
//     }
// }
bool check1(Point a,Point b,Point c)
{ 
    __int128 res1=Cross(a,b),res2=Cross(a,c);
    if(res1*res2<0) return 0;
    return 1;
}
int main()
{
    cin.tie(nullptr) ->sync_with_stdio(false);

    cin>>t;
    while(t--)
    {
        cin>>n;
        cin>>be_x>>be_y>>r;
        be={be_x,be_y};
        for(int i=1;i<=n;i++) cin>>a[i].x>>a[i].y;
        c.clear();
        ll ans=0LL;
        
        for(int i=1;i<=n;i++)
        {
            c.clear();
            c.push_back(a[i]);
            int j=i,numk=1;
            int jj=i+1;
            jj%=n;
            if(jj==0) jj=n;
            Point k1=be-a[i];
            Point k2=a[jj]-a[i];
            while(numk<n)
            {
                j++;numk++;
                j%=n;
                if(j==0) j=n;
                if(!check(be,a[i],a[j])) break;
                Point k3=a[j]-a[i];
                if(!check1(k1,k2,k3)) break;
                c.push_back(a[j]);
                ans=max(ans,(ll) ComputePolygonArea(c));
            }
            // cerr<<i<<" "<<j-1<<" asd"<<endl;
            // cout<<check(be,a[3],a[1])<<"  asd"<<endl;
            c.clear();
            c.push_back(a[i]);
            j=i;numk=1;
            jj=i-1;
            jj=(jj%n+n)%n;
            if(jj==0) jj=n;
            k1=be-a[i];
            k2=a[jj]-a[i];
            while(numk<n)
            {
                j--;numk++;
                j=(j%n+n)%n;
                if(j==0) j=n;
                if(!check(be,a[i],a[j])) break;
                Point k3=a[j]-a[i];
                if(!check1(k1,k2,k3)) break;
                c.push_back(a[j]);
                ans=max(ans,(ll) ComputePolygonArea(c));
            }

        }

        cout<<ans<<'\n';
    }
    
    return 0;
}
/*

*/

详细

Test #1:

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

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: 0
Accepted
time: 3ms
memory: 11480kb

input:

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

output:

0

result:

ok 1 number(s): "0"

Test #3:

score: 0
Accepted
time: 36ms
memory: 11528kb

input:

6666
19
-142 -128 26
-172 -74
-188 -86
-199 -157
-200 -172
-199 -186
-195 -200
-175 -197
-161 -188
-144 -177
-127 -162
-107 -144
-90 -126
-87 -116
-86 -104
-89 -97
-108 -86
-125 -80
-142 -74
-162 -72
16
-161 -161 17
-165 -190
-157 -196
-154 -197
-144 -200
-132 -200
-128 -191
-120 -172
-123 -163
-138...

output:

5093
3086
2539
668
3535
7421
4883
5711
5624
1034
2479
3920
4372
2044
4996
5070
2251
4382
4175
1489
1154
3231
4038
1631
5086
14444
1692
6066
687
1512
4849
5456
2757
8341
8557
8235
1013
5203
10853
6042
6300
4480
2303
2728
1739
2187
3385
4266
6322
909
4334
1518
948
5036
1449
2376
3180
4810
1443
1786
47...

result:

ok 6666 numbers

Test #4:

score: 0
Accepted
time: 42ms
memory: 11480kb

input:

6660
19
-689502500 -712344644 121094647
-534017213 -493851833
-578925616 -506634533
-663335128 -540066520
-748890119 -585225068
-847722967 -641694086
-916653030 -716279342
-956235261 -766049951
-1000000000 -836145979
-963288744 -923225928
-948140134 -944751289
-920681768 -972760883
-872492254 -10000...

output:

117285633945667137
89094762176992129
84336379088082383
63629451600307531
193020267813347512
73921930794195237
59524748406448173
34419869321856821
207356845785317033
185783506654647921
80463327658075813
156569165998743736
129550296314602340
157065066097450631
77819745596643484
40796197589680466
11394...

result:

ok 6660 numbers

Test #5:

score: 0
Accepted
time: 42ms
memory: 11492kb

input:

6646
17
-822557900 -719107452 81678600
-810512657 -985436857
-717822260 -1000000000
-636451281 -949735403
-599009378 -915571539
-596352662 -824307789
-736572772 -553995003
-765031367 -500309996
-797636289 -458500641
-842827212 -428669086
-871078362 -428977078
-928761972 -490982466
-999825512 -570408...

output:

110526056201314429
15027921575542560
53254517372894023
258485758440262622
34392829191543913
76614213562057620
145259866156654928
42339731416270977
143102643161355094
106105394104280855
145392090901459236
43856914998019051
173982988807640937
44231578293584008
58978505810355496
23485666110810764
12532...

result:

ok 6646 numbers

Test #6:

score: 0
Accepted
time: 45ms
memory: 11532kb

input:

6669
15
-874867377 -757943357 7111757
-974567193 -807217609
-949619167 -890139925
-934615014 -930145748
-888846948 -960741232
-795467329 -1000000000
-722124377 -940364550
-622857698 -842665231
-578818283 -747428314
-780030596 -534753737
-866558348 -484345048
-928090924 -519994734
-987269004 -5856231...

output:

182950707425830089
29338404516797685
84520746595092394
105477320399449524
73884037892247358
49031829753894899
48108760133499810
178434777514737858
31287633742235961
84173958668093920
15282003310382472
106987783997819044
50751134064267722
22920035202317059
79797616191974237
75995194318427644
94277118...

result:

ok 6669 numbers

Test #7:

score: 0
Accepted
time: 41ms
memory: 11412kb

input:

6673
11
-746998467 -874016929 25938500
-1000000000 -901415571
-645111069 -992353393
-547811885 -1000000000
-483640464 -931109189
-546643988 -877114659
-625764830 -834162211
-723093733 -813353581
-811419393 -799116488
-879584543 -791576283
-944145006 -828676656
-998000881 -880308971
14
-826271552 -81...

output:

54570343814105147
74950556637655098
38052401037814742
109159348998561498
21083015515232346
31649646072675313
42326841119894707
158636477858979605
129690295986443039
112077348808529800
16900062518936042
63732368902300348
79182769273740625
142098431062104007
111981825046535522
38580332981675983
631960...

result:

ok 6673 numbers

Test #8:

score: -100
Time Limit Exceeded

input:

1
100000
312059580 -177336163 523906543
43599219 998132845
43570757 998134606
43509809 998138374
43456461 998141672
43379797 998146410
43325475 998149757
43283580 998152335
43207966 998156986
43131288 998161701
43054854 998166387
42988614 998170421
42922795 998174418
42844022 998179189
42778015 9981...

output:


result: