QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#745122#9434. Italian CuisinefosovWA 1ms3664kbC++142.4kb2024-11-14 05:33:122024-11-14 05:33:12

Judging History

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

  • [2024-11-14 05:33:12]
  • 评测
  • 测评结果:WA
  • 用时:1ms
  • 内存:3664kb
  • [2024-11-14 05:33:12]
  • 提交

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>

#define N 300010
#define K 20

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);


    assert((la - c) / rl == (lb - c) / rl);
    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;

    bool s0 = (b - a) * (x - a) >= 0;
    bool s1 = (c - b) * (x - b) >= 0;
    bool s2 = (a - c) * (x - c) >= 0;
    return s0 == s1 && s1 == s2;
}

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, area = 0; 
        for (int i = 0, j = 1; i < n; ++ i) {
            while (j != i && !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 << "start " << conv[i].x << ' ' << conv[i].x << " <=> ";
            // cout << "end " << conv[j-1].x << ' ' << conv[j-1].y << '\n';
            // cout << "area = " << area << '\n';
        }
        
        cout << res << '\n';
    }
}

詳細信息

Test #1:

score: 100
Accepted
time: 1ms
memory: 3496kb

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: 3664kb

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'