QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#609595#9434. Italian CuisineexpectantTL 0ms0kbC++143.0kb2024-10-04 13:31:182024-10-04 13:31:20

Judging History

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

  • [2024-10-04 13:31:20]
  • 评测
  • 测评结果:TL
  • 用时:0ms
  • 内存:0kb
  • [2024-10-04 13:31:18]
  • 提交

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 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;
    rep(i,1,n){
        while(true){
            if(cross(a[cur+1]-a[i],p-a[i])<=0) break;
            if(!chk((line){a[i],a[cur+1]})) break;
            ret+=cross(a[cur]-a[i],a[cur+1]-a[i]);
            ++cur;
        }
        chkmax(ans,ret);
        ret-=cross(a[cur]-a[i],a[cur]-a[i+1]);
    }
    // ll res=0,ans=0;
    // for (int l = 1, r = 2;l < n;l ++){
    //     while (1){
    //         int rr = r%n+1;
    //         ll s = cross(a[rr] - a[l], p - a[l]);             
    //         if (s <= 0) break;
    //         if (!chk({a[l],a[rr]})){
    //             break;
    //         }

    //         res += cross(a[r] - a[l], a[rr] - a[l]);
    //         r = rr;
    //     }
    //     ans = max(ans, llabs(res));
    //     std::cerr<<"qwq "<<l<<' '<<r<<'\n';
    //     int ll = l%n+1;
    //     res -= cross(a[r] - a[l], a[r] - a[ll]);
    // }
    return ans;
}
int main(){
    freopen("in.txt","r",stdin);
    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();
        rep(i,1,n) a[i+n]=a[i];
        printf("%lld\n",solve());
    }
}

详细

Test #1:

score: 0
Time Limit Exceeded

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:


result: