QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#602635#9434. Italian CuisineEricWWA 4ms3796kbC++204.9kb2024-10-01 11:25:012024-10-01 11:25:01

Judging History

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

  • [2024-10-01 11:25:01]
  • 评测
  • 测评结果:WA
  • 用时:4ms
  • 内存:3796kb
  • [2024-10-01 11:25:01]
  • 提交

answer

// Program written by EricWu ~~~
#include <bits/stdc++.h>
 
#define lowbit(x) (x & -x)
 
using namespace std;
 
inline char gc(void) {
    static char buf[100000], *p1 = buf, *p2 = buf;
    return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 100000, stdin), p1 == p2) ? EOF : *p1++;
}
 
#define gc() getchar()
 
template <class T> inline void read(T &x) {
    T f = 1; x = 0; static char c = gc();
    for (; !isdigit(c); c = gc()) if (c == '-') f = -f;
    for (; isdigit(c); c = gc()) x = x * 10 + (c & 15);
    if (f == -1) x = -x;
}
 
inline void readstr(char *s) {
    do *s = gc(); while ((*s == ' ') || (*s == '\n') || (*s == '\r'));
    do *(++s) = gc(); while ((~*s) && (*s != ' ') && (*s != '\n') && (*s != '\r'));
    *s = 0; return;
}
 
inline void readch(char&x) { while (isspace(x = gc())); }
 
char pf[100000], *o1 = pf, *o2 = pf + 100000;
#define ot(x) (o1 == o2 ? fwrite(pf, 1, 100000, stdout), *(o1 = pf) ++= x : *o1 ++= x)
template <class T>
inline void println(T x, char c = '\n') {
    if (x < 0) ot(45), x = -x;
    static char s[15], *b; b = s;
    if (!x) *b ++= 48;
    for (; x; * b ++= x % 10 + 48, x /= 10);
    for (; b-- != s; ot(*b)); ot(c);
}
 
template <class T> inline void write(T x) {
    if (x < 0) x = -x, putchar('-');
    if (x > 9) write(x / 10);
    putchar(x % 10 + 48);
}
 
template <class T> inline void writeln(T x, char c = '\n') { write(x); putchar(c); }
template <class T> inline void chkmax(T &x, const T y) { x > y ? x = x : x = y; }
template <class T> inline void chkmin(T &x, const T y) { x < y ? x = x : x = y; }
 
#define Ms(arr, opt) memset(arr, opt, sizeof(arr))
#define Mp(x, y) make_pair(x, y)
#define endl '\n'

typedef long long ll;
typedef pair <int, int> pii;
typedef array<int, 3> piii;
using i64 = long long;
const int inf = 1e9;

const double eps = 1e-9;
const long double PI = acos(-1.0);
struct Point {
    i64 x, y;
    Point(i64 x = 0, i64 y = 0) : x(x), y(y) {}
};
ostream& operator<<(ostream &os, const Point &p) {return os << p.x << " " << p.y;}
typedef Point Vector;

Vector operator+(const Vector &p1, const Vector &p2) {return Vector(p1.x + p2.x, p1.y + p2.y);}
Vector operator-(const Vector &p1, const Vector &p2) {return Vector(p1.x - p2.x, p1.y - p2.y);}
bool operator==(const Point &p1, const Point &p2) {return p1.x == p2.x && p1.y == p2.y;}
bool operator<(const Point &p1, const Point &p2) {return p1.x < p2.x || (p1.x == p2.x && p1.y < p2.y);}
i64 Cross(const Vector &a, const Vector &b) {return a.x * b.y - a.y * b.x;}
double Dist(const Point &a, const Point &b) {
    return sqrt(1.0 * (a.x - b.x) * (a.x - b.x) + 1.0 * (a.y - b.y) * (a.y - b.y));
}
Vector Rotate(const Vector &a, const double rad) {
    return Vector(a.x * cos(rad) - a.y * sin(rad), a.x * sin(rad) + a.y * cos(rad));
}
i64 Dot(const Vector &a, const Vector &b) { return a.x * b.x + a.y * b.y;}
double Length(const Vector& a) {return sqrt(1.0 * Dot(a, a)); }
double Angle(const Vector &a, const Vector &b) {
    return asin(Cross(a, b) / Length(a) / Length(b));
}
int dcmp(long double a) {if (fabs(a) <= eps) return 0; return a > 0 ? 1 : -1;}
int dcmp(double a, double b) {
    if (fabs(a - b) <= eps) return 0;
    return a > b ? 1 : -1;
}
i64 Area(const Point &a, const Point &b, const Point &c) {
    Vector u = a - b, v = a - c;
    return abs(Cross(u, v));
}
i64 Dist2(const Point &a, const Point &b) {
    return (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y);
}
bool cmp(const Point &a, const Point &b, const Point &c, int r1) {
    i64 area = Area(a, b, c);
    i64 len = Dist2(a, b);
    // cout << "area = " << " " << "len = " << endl;
    // writeln(area, ' '); writeln(len);
    // cout << "are = " << area << " " << "len = " << len << endl;
    if ((__int128_t)area * area >= (__int128_t)r1  * r1 * len) return true;
    return false;
}

void solve() {
    int n; read(n); 
    int x1, y1, r1; read(x1), read(y1), read(r1);
    Point p1(x1, y1);
    vector<Point> p(2 * n);
    for (int i = 0;i < n;i++) read(p[i].x), read(p[i].y);
    for (int i = n;i < 2 * n;i++) p[i] = p[i - n];
    int ans = 0; int k = 2;
    // cmp(p[2], p[3], p1, r1);
    for (int i = 0;i < 2 * n;i++) {
        int j = i + 1; k = max(k, i + 2);
        if (j < 2 * n && !cmp(p[i], p[j], p1, r1)) continue;
        if (k < 2 * n && !cmp(p[i], p[k], p1, r1)) continue;
        int area = 0;
        while (k < 2 * n) {
            // cout << i << " " << k - 1 << " " << k << endl;
            area += Area(p[i], p[k], p[k - 1]);
            if (k + 1 < 2 * n && !cmp(p[i], p[k + 1], p1, r1)) break;
            if (k + 1 < 2 * n && Cross(p[i] - p[k], p[i] - p1) * Cross(p[i] - p[k + 1], p[i] - p1) <= 0) break;
            k ++;
        }
        ans = max(ans, area);
    }
    writeln(ans);
}

int main() {
    int T = 1; read(T);
    while (T--) solve();
    // system("pause");
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

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

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

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
Wrong Answer
time: 4ms
memory: 3452kb

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:

5093
2814
2435
668
3535
5872
4732
4842
4851
1034
2214
3729
3561
2044
4996
5070
2251
4076
4175
1489
946
3231
4038
1535
3964
12777
1692
5069
687
1512
2985
5268
2713
8167
6839
7991
945
4744
9935
5655
4174
3865
2073
2695
1394
2106
3225
3930
4343
909
4334
1371
948
4342
1268
2376
2311
4179
1360
1786
4097
...

result:

wrong answer 2nd numbers differ - expected: '3086', found: '2814'