QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#602635 | #9434. Italian Cuisine | EricW | WA | 4ms | 3796kb | C++20 | 4.9kb | 2024-10-01 11:25:01 | 2024-10-01 11:25:01 |
Judging History
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;
}
详细
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'