QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#624197#9434. Italian CuisineTecyWA 1ms3624kbC++208.2kb2024-10-09 15:12:582024-10-09 15:13:02

Judging History

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

  • [2024-10-09 15:13:02]
  • 评测
  • 测评结果:WA
  • 用时:1ms
  • 内存:3624kb
  • [2024-10-09 15:12:58]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;

void error() {
	cerr << endl;
}

template<class T, class... Args>
void error(T val, Args... args) {
	cerr << val << " ";
	error(args...);
}

const long double eps = 1e-9;

struct point {
    long double x;
    long double y;

    point(long double _x = 0, long double _y = 0){
        x = _x;
        y = _y;
    }

    long double square_length() const {
        return x * x + y * y;
    }
    //模长
    long double length() const {
        return sqrtl(x * x + y * y);
    }

    friend point operator+(const point& lp, const point& rp){
        return point(lp.x + rp.x, lp.y + rp.y);
    }

    friend point operator-(const point& lp, const point& rp){
        return point(lp.x - rp.x, lp.y - rp.y);
    }

    friend point operator*(const point& p, const long double& k){
        return point(p.x * k, p.y * k);
    }

    friend point operator*(const long double& k, const point& p){
        return point(p.x * k, p.y * k);
    }

    friend point operator/(const point& p, const long double& k){
        return point(p.x / k, p.y / k);
    }

    friend bool operator==(const point& lp, const point& rp){
        return abs(lp.x - rp.x) < eps && abs(lp.y - rp.y) < eps;
    }

    friend bool operator!=(const point& lp, const point& rp){
        return abs(lp.x - rp.x) > eps || abs(lp.y - rp.y) > eps;
    }
};

//点乘
long double dot(const point& lp, const point& rp){
    return lp.x * rp.x + lp.y * rp.y;
}

//叉乘
long double cross(const point& lp, const point& rp){
    return lp.x * rp.y - lp.y * rp.x;
}

long double square_distance(const point& lp, const point& rp){
    return (lp.x - rp.x) * (lp.x - rp.x) + (lp.y - rp.y) * (lp.y - rp.y);
}   

//两点距离
long double distance(const point& lp, const point& rp){
    return sqrtl((lp.x - rp.x) * (lp.x - rp.x) + (lp.y - rp.y) * (lp.y - rp.y));
}

const long double PI = 3.141592653589793;

//矢量旋转 逆时针旋转 o (弧度制)
point rotate(const point& v, long double o){
    long double x = v.x * cos(o) - v.y * sin(o);
    long double y = v.x * sin(o) + v.y * cos(o);
    return point(x, y);
}

//点到直线的距离 p到lp--rp的距离
long double distance(const point& lp, const point& rp, const point& p){
    point vl = rp - lp;
    point vr = p - lp;
    return cross(vl, vr) / vl.length();
}

//符号判断
int sign(long double x){
    if(x > eps){//正数
        return 1;
    }
    if(x < -eps){//负数
        return -1;
    }
    return 0;
}

//点在线段上(含端点) lp rp 为线段端点
bool on_segment(const point& lp, const point& rp, const point& p){
    point vl = rp - lp;
    point vr = p - lp;
    long double sv = cross(vl, vr);
    if(sign(sv) != 0){//不在直线上
        return false;
    }
    long double cv = dot(vl, vr);
    if(sign(cv) == -1){//在线段外
        return false;
    }
    return vr.length() <= vl.length();
}

//点在线段上(不含端点) lp rp 为线段端点
bool on_segment_strict(const point& lp, const point& rp, const point& p){
    return on_segment(lp, rp, p) && lp != p && rp != p;
}

//求垂点 p到直线lp--rp的垂点
point foot(const point& lp, const point& rp, const point& p){
    point vl = rp - lp;
    point vr = p - lp;
    long double k = dot(vl, vr) / vl.length() / vl.length();
    return lp + vl * k;
}

//点 p 是否在直线 lp-rp 上
bool on_line(const point& lp, const point& rp, const point& p) {
    point vl = rp - lp;
    point vr = p - lp;
    return sign(cross(vl, vr)) == 0;
}

//点 p 是否射线 lp->rp 上
bool on_ray(const point& lp, const point& rp, const point& p) {
    point vl = rp - lp;
    point vr = p - lp;
    return sign(cross(vl, vr)) == 0 && sign(dot(vl, vr)) != -1;
}

//两直线交点
point intersect(const point& flp, const point& frp, const point& slp, const point& srp){
    point sf = flp - slp;
    point vf = frp - flp;
    point vs = srp - slp;
    long double k = cross(sf, vs) / cross(vs, vf);
    return flp + vf * k;
}

// 两直线是否平行 (直线的两点不能相同) / 需要考虑直线重合的情况
bool parallel(const point& flp, const point& frp, const point& slp, const point& srp) {
    point vf = frp - flp;
    point vs = srp - slp;
    return sign(cross(vs, vf)) == 0;
}

// 直线是否重合
bool equal(const point& flp, const point& frp, const point& slp, const point& srp) {
    point vf = frp - flp;
    point vs = srp - slp;
    point sf = flp - slp;
    return sign(cross(vs, vf)) == 0 && sign(cross(sf, vs)) == 0;
}

struct circle {
    point o;
    long double r;
};

//垂直平分线 两点式
pair<point, point> perpendicular(const point& lp, const point& rp){
    return { (lp + rp) / 2, (lp + rp) / 2 + rotate(rp - lp, PI / 2) };
}

//三点确定圆 (外接圆)
circle cover(const point& a, const point& b, const point& c){
    auto lp = perpendicular(a, b);
    auto rp = perpendicular(a, c);
    point o = intersect(lp.first, lp.second, rp.first, rp.second);
    return { o, distance(o, a) };
}

// 三角形内切圆, 需要三点不共线
circle inner (const point& a, const point& b, const point& c) {
    point ab = b - a;
    point ac = c - a;
    point ao = (ab / ab.length() + ac / ac.length()) / 2 + a;
    point ba = a - b;
    point bc = c - b;
    point bo = (ba / ba.length() + bc / bc.length()) / 2 + b;
    auto o = intersect(a, ao, b, bo);
    return { o, abs(distance(a, b, o)) };
}

// 求直线与圆的交点 保证有交点的情况下
pair<point, point> intersect(const point& lp, const point& rp, const circle& c) {
    point ft = foot(lp, rp, c.o);
    long double oft = distance(c.o, ft);
    long double k = sqrtl(c.r * c.r - oft * oft);
    point lr = (rp - lp) * k / distance(lp, rp);
    return { ft + lr, ft - lr };
}

// 求两圆的交点, 保证有交点
pair<point, point> intersect(const circle& lc, const circle& rc) {
    long double d = distance(lc.o, rc.o);
    long double k = ((lc.r * lc.r - rc.r * rc.r) / d + d) / 2;
    long double o = acos(k / lc.r);
    point lr = rc.o - lc.o;
    point lu = rotate(lr, o);
    lu = lu / lu.length() * lc.r;
    point ld = rotate(lr, -o);
    ld = ld / ld.length() * lc.r;
    return { lc.o + lu, lc.o + ld };
}

bool isLeft(const point& lp, const point& rp, const point& p) {
    return sign(cross(rp - lp, p - lp)) > 0;
}

bool isLeft(const point& lp, const point& rp, const circle& cle) {
    return sign(distance(lp, rp, cle.o) - cle.r) > 0 && isLeft(lp, rp, cle.o);
}

long double triangle(const point& a, const point& b, const point& c) {
    if (a == b || a == c || b == c) {
        return 0;
    }
    long double d = abs(distance(b, c, a));
    return d * (b - c).length() / 2;
}

/*
auto convex = Andrew(vp);
int m = convex.size();
long double d = 0;
for(int i = 0, j = 1;i < m;i++){
    while(cross(convex[(i + 1) % m] - convex[i], convex[j] - convex[i]) < cross(convex[(i + 1) % m] - convex[i], convex[(j + 1) % m] - convex[i])){
        j = (j + 1) % m;
    }
    d = max(d, max(distance(convex[i], convex[j]), distance(convex[(i + 1) % m], convex[j])));
}
*/

inline void Tecy() {
    using i64 = int64_t;
    i64 n;
    cin >> n;
    i64 ox, oy, r;
    cin >> ox >> oy >> r;
    circle cle;
    cle.o.x = ox;
    cle.o.y = oy;
    cle.r = r;
    vector<point> cx(n);
    vector<i64> px(n), py(n);
    for (int i = 0; i < n; i++) {
        cin >> px[i] >> py[i];
        cx[i].x = px[i];
        cx[i].y = py[i];
    }

    long double ans = 0;
    long double tmp = 0;
    for (int i = 0, j = 0; i < n; i++) {
        while (isLeft(cx[i], cx[(j + 1) % n], cle)) {
            tmp += triangle(cx[i], cx[j], cx[(j + 1) % n]);
            // error(i, j, (j + 1) % n, triangle(cx[i], cx[j], cx[(j + 1) % n]));
            j = (j + 1) % n;
        }
        // error(i, j, tmp);
        ans = max(ans, tmp);
        tmp -= triangle(cx[i], cx[(i + 1) % n], cx[j]);
    }

    cout << (long long) round(ans * 2) << "\n";
}

int main() {
    ios::sync_with_stdio(false);
    cout.tie(0);
    cin.tie(0);

    int T = 1;
    cin >> T;
    while (T--) {
        Tecy();	
    }

    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Wrong Answer
time: 1ms
memory: 3624kb

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:

0
24
0

result:

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