이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using std::vector;
using std::array;
using std::pair;
using std::tuple;
using i64 = std::int64_t;
using i128 = __int128_t;
struct Point {
i64 x, y;
Point() : x(0), y(0) {}
Point(const i64 x, const i64 y) : x(x), y(y) {}
Point operator-(const Point& t) const {
return Point(x - t.x, y - t.y);
}
friend i128 cross(const Point& p, const Point& q) {
return (i128)p.x * q.y - (i128)p.y * q.x;
}
};
int main() {
std::ios_base::sync_with_stdio(false);
std::cin.tie(nullptr);
int T, N;
std::cin >> T >> N;
vector<Point> P(N);
for (auto& [x, y] : P) {
std::cin >> x >> y;
}
P.push_back(P[0]);
const auto ccw = [&](const int i, const Point& p) {
return cross(P[i + 1] - P[i], p - P[i]) > 0;
};
int Q;
std::cin >> Q;
int count = 0;
const int H = N / 2;
while (Q--) {
const Point p = [&] {
i64 a, b;
std::cin >> a >> b;
const i64 x = (i64)T * count * count * count;
return Point(a ^ x, b ^ x);
}();
if (ccw(0, p) and ccw(N / 2, p)) {
std::cout << "DA\n";
count += 1;
continue;
}
if (!ccw(0, p) and !ccw(H, p)) {
std::cout << "NE\n";
continue;
}
const int pivot = (ccw(0, p) ? 0 : H);
const int other = pivot ^ H;
int len = 0;
len += [&] {
int ok = 0, ng = H;
while (ng - ok > 1) {
const int md = (ok + ng) / 2;
(ccw(pivot + md, p) ? ok : ng) = md;
}
return ng;
}();
len += [&] {
int ok = 0, ng = H;
while (ng - ok > 1) {
const int md = (ok + ng) / 2;
(ccw(other + md, p) ? ng : ok) = md;
}
return H - ng;
}();
if (len > H) {
std::cout << "DA\n";
count += 1;
} else {
std::cout << "NE\n";
}
}
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |