QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#609547 | #9434. Italian Cuisine | expectant | WA | 0ms | 3748kb | C++14 | 2.8kb | 2024-10-04 13:24:59 | 2024-10-04 13:25:08 |
Judging History
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());
}
}
详细
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'