QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#609479 | #9434. Italian Cuisine | expectant | RE | 0ms | 0kb | C++14 | 2.5kb | 2024-10-04 13:11:59 | 2024-10-04 13:12:00 |
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 ll solve(){
int cur=0;
ll ret=0,ans=0;
rep(i,1,n){
assert(cur>=i+1);
while(cur<i+n-1){
if(cross(p-a[i],a[cur+1]-a[i])<=0) break;
if(disline((line){a[i],a[cur+1]},p)<r) break;
ret+=cross(a[cur+1]-a[i],a[cur]-a[i]);
++cur;
}
chkmax(ans,ret);
ret-=cross(a[cur]-a[i+1],a[cur]-a[i]);
}
return ans;
}
int main(){
drp(task,read(),1){
n=read();
p.x=read(),p.y=read(),r=read();
rep(i,1,n) 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: 0
Runtime Error
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