QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#609547#9434. Italian CuisineexpectantWA 0ms3748kbC++142.8kb2024-10-04 13:24:592024-10-04 13:25:08

Judging History

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

  • [2024-10-04 13:25:08]
  • 评测
  • 测评结果:WA
  • 用时:0ms
  • 内存:3748kb
  • [2024-10-04 13:24:59]
  • 提交

answer

#include <bits/stdc++.h>
#define rep(i,j,k) for(int i=j;i<=(k);++i)
#define drp(i,j,k) for(int i=j;i>=(k);--i)
#define isdigit(ch) (ch>=48&&ch<=57)
#define mp std::make_pair
#define mod 1000000007
#define MAXN 1000005
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
typedef std::pair<int,int> pii;
typedef std::pair<ll,ll> pll;
inline int read(){
	int x=0;
	bool sgn=true;
	char ch=getchar();
	while(!isdigit(ch)) sgn^=ch=='-',ch=getchar();
	while(isdigit(ch)) x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
	return sgn?x:-x;
}
inline ll readll(){
	ll x=0;
	bool sgn=true;
	char ch=getchar();
	while(!isdigit(ch)) sgn^=ch=='-',ch=getchar();
	while(isdigit(ch)) x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
	return sgn?x:-x;
}
template <typename tp> inline tp min(tp x,tp y){return x<y?x:y;}
template <typename tp> inline tp max(tp x,tp y){return x>y?x:y;}
template <typename tp> inline bool chkmin(tp &x,tp y){return x>y&&(x=y,true);}
template <typename tp> inline bool chkmax(tp &x,tp y){return x<y&&(x=y,true);}
int n;
ll R;
struct point{
    ll x,y;
    inline point operator + (const point &rhs)const{
        return (point){x+rhs.x,y+rhs.y};
    }
    inline point operator - (const point &rhs)const{
        return (point){x-rhs.x,y-rhs.y};
    }
    inline point operator * (ll val)const{
        return (point){x*val,y*val}; 
    }
}p,a[MAXN];
struct line{
    point st,ed;
    inline ll sqlen()const{
        return (st.x-ed.x)*(st.x-ed.x)+(st.y-ed.y)*(st.y-ed.y);
    }
};
inline ll dot(const point &lhs,const point &rhs){
    return lhs.x*rhs.x+lhs.y*rhs.y;
}
inline ll cross(const point &lhs,const point &rhs){
    return lhs.x*rhs.y-lhs.y*rhs.x;
}
inline ld disline(const line &l,const point &cur){
    return fabsl(cross(l.st-cur,l.ed-cur)/sqrtl(l.sqlen()));
}
// inline bool chk(const line &l){
//     return (__int128)cross(l.st-p,l.ed-p)*cross(l.st-p,l.ed-p)>(__int128)r*r*l.sqlen();
// }
inline ll solve(){
    // int cur=2;
    // ll ret=0,ans=0;
    ll res=0,ans=0;
    for (int l = 0, r = 1;l < n;l ++){
        while (1){
            int rr = (r + 1) % n;
            ll s = cross(a[rr] - a[l], p - a[l]);             
            if (s <= 0) break;

            if (disline({a[l], a[rr]},p) < R){
                break;
            }

            res += cross(a[r] - a[l], a[rr] - a[l]);
            r = rr;
        }
        ans = max(ans, llabs(res));
        int ll = (l + 1) % n;
        res -= cross(a[r] - a[l], a[r] - a[ll]);
    }
    return ans;
}
int main(){
    drp(task,read(),1){
        n=read();
        p.x=read(),p.y=read(),R=read();
        rep(i,0,n-1) a[i].x=read(),a[i].y=read();
        // std::reverse(a+1,a+n+1);
        // rep(i,1,n) a[i+n]=a[i];
        printf("%lld\n",solve());
    }
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

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

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: 3748kb

input:

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

output:

286862654137719264

result:

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