QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#745128#9434. Italian CuisinefosovTL 0ms3836kbC++142.3kb2024-11-14 06:00:482024-11-14 06:00:49

Judging History

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

  • [2024-11-14 06:00:49]
  • 评测
  • 测评结果:TL
  • 用时:0ms
  • 内存:3836kb
  • [2024-11-14 06:00:48]
  • 提交

answer

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

#define ll long long 
#define INF 0x3f3f3f3f
#define LNF 0x3f3f3f3f3f3f3f3fll
#define MOD 998244353
#define pii pair<int, int>

struct Point {
    ll x, y;

    Point() {};
    Point(int x, int y): x(x), y(y) {};

    Point operator+ (const Point& p) const {
        return Point(x + p.x, y + p.y);
    }

    Point operator- (const Point& p) const {
        return Point(x - p.x, y - p.y);
    }

    ll operator* (const Point& p) const {
        return x * p.y - y * p.x;
    }

    ll operator/ (const Point& p) const {
        return x * p.x + y * p.y;
    }
};

bool circle_line_intersect(Point c, ll r, Point la, Point lb) {
    Point l = la - lb;
    if (l.x == 0 && l.y == 0) return 0;
    Point rl = Point(-l.y, l.x);

    return abs((la - c) / rl) <= r * sqrt(rl / rl);
}

bool point_in_triangle(Point a, Point b, Point c, Point x) {
    if ((b - a) * (c - a) == 0) return 0;
    if ((a - b) * (c - b) == 0) return 0;
    if ((a - c) * (b - c) == 0) return 0;

    ll s0 = (b - a) * (x - a);
    ll s1 = (c - b) * (x - b);
    ll s2 = (a - c) * (x - c);

    bool has_neg = (s0 < 0) || (s1 < 0) || (s2 < 0);
    bool has_pos = (s0 > 0) || (s1 > 0) || (s2 > 0);

    return !(has_neg && has_pos);
}

int main() {
#ifdef TEST
    freopen("zz.in", "r+", stdin);
#endif
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    int t; cin >> t;
    while (t --) {
        int n; cin >> n;

        vector<Point> conv(n);
        Point c;
        int r;

        cin >> c.x >> c.y >> r;
        for (int i = 0; i < n; ++ i) cin >> conv[i].x >> conv[i].y;

        ll res = 0;
        
        ll area = 0; 
        for (int i = 0, j = -1; i < n; ++ i) {
            if (area == 0) j = (i + 1) % n;
            while (!circle_line_intersect(c, r, conv[i], conv[j]) && (j <= i+1 || !point_in_triangle(conv[i], conv[j-1], conv[j], c))) {
                if (j > i+1) {
                    area += (conv[(j+n-1)%n] - conv[i]) * (conv[j] - conv[i]);
                }
                j = (j + 1) % n;
            }

            res = max(res, area);
            if (j - i >= 3) area -= (conv[i+1] - conv[i]) * (conv[j-1] - conv[i]);
        }

        cout << res << '\n';
    }
}

詳細信息

Test #1:

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

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: 0
Accepted
time: 0ms
memory: 3836kb

input:

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

output:

0

result:

ok 1 number(s): "0"

Test #3:

score: -100
Time Limit Exceeded

input:

6666
19
-142 -128 26
-172 -74
-188 -86
-199 -157
-200 -172
-199 -186
-195 -200
-175 -197
-161 -188
-144 -177
-127 -162
-107 -144
-90 -126
-87 -116
-86 -104
-89 -97
-108 -86
-125 -80
-142 -74
-162 -72
16
-161 -161 17
-165 -190
-157 -196
-154 -197
-144 -200
-132 -200
-128 -191
-120 -172
-123 -163
-138...

output:


result: