QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#167988 | #2434. Single Cut of Failure | PetroTarnavskyi | WA | 2ms | 3972kb | C++17 | 3.4kb | 2023-09-07 19:33:16 | 2023-09-07 19:33:16 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
#define FOR(i, a, b) for (int i = (a); i < (b); i++)
#define RFOR(i, a, b) for (int i = (a); i >= (b); i--)
#define FILL(a, b) memset(a, b, sizeof(a))
#define SZ(a) int(a.size())
#define ALL(a) a.begin(), a.end()
#define PB push_back
#define MP make_pair
#define F first
#define S second
typedef long long LL;
#define int LL
typedef vector<int> VI;
typedef pair<int, int> PII;
typedef double db;
int w, h;
int f(int x, int y)
{
if (x == 0) return y;
if (y == h) return (h + x);
if (x == w) return (h + w + h - y);
return (h + h + w + w - x);
}
int getSide(int c)
{
if (c < h) return 0;
if (c < (h + w)) return 1;
if (c < (h + w + h)) return 2;
if (c < (h + w + h + w)) return 3;
assert(0);
}
PII g(int c)
{
if (c < h) return {0, h - c};
else if (c < (h + w)) return {c - h, 0};
else if (c < (h + w + h)) return {w, c - (h + w)};
else if (c < (h + w + h + w)) return {w - (c - (h + w + h)), h};
else
assert(0);
}
bool check(int l1, int r1, int l2, int r2)
{
if (l2 > r2)
swap(l2, r2);
if (l1 > r1)
swap(l1, r1);
return (l1 < l2 && r1 < r2 && l2 < r1) || (l2 < l1 && r2 < r1 && l1 < r2);
}
bool check2(int l1, int r1, int l2, int r2, int l3, int r3)
{
return check(l1, r1, l3, r3) || check(l2, r2, l3, r3);
}
int coor[4];
int32_t main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int n;
cin >> n >> w >> h;
w *= 2;
h *= 2;
coor[0] = h;
coor[1] = h + w;
coor[2] = h + w + h;
coor[3] = 0;
vector<PII> v(2 * n);
vector<VI> mn(n);
VI l(n), r(n);
FOR (i, 0, n)
{
int x1, y1, x2, y2;
cin >> x1 >> y1 >> x2 >> y2;
x1 *= 2;
y1 *= 2;
x2 *= 2;
y2 *= 2;
y1 = h - y1;
y2 = h - y2;
l[i] = f(x1, y1);
r[i] = f(x2, y2);
v[2 * i] = {l[i], i};
v[2 * i + 1] = {r[i], i};
}
sort(ALL(v));
FOR (i, 0, 2 * n)
{
mn[v[i].S].PB(i);
}
FOR (i, 0, n)
sort(ALL(mn[i]), greater<int>());
set<int> mnpos;
FOR (i, 0, n)
mnpos.insert(mn[i].back());
FOR (i, 0, 2 * n)
{
if (*mnpos.rbegin() - i == n - 1)
{
int c1 = v[i].F - 1;
int c2 = v[i + n - 1].F + 1;
assert(c1 < c2);
if (getSide(c1) == getSide(c2))
{
assert(c1 < c2);
c2 = coor[getSide(c2)] + 1;
}
assert(getSide(c1) != getSide(c2));
assert(max(c1, c2) < (2 * w + 2 * h));
FOR (k, 0, n)
{
if (!check(c1, c2, l[k], r[k]))
assert(0);
assert(c1 != l[k] && c1 != r[k]);
assert(c2 != l[k] && c2 != r[k]);
}
FOR(t, 0, 4)
{
assert(c1 != coor[t] && c2 != coor[t]);
}
cout << 1 << '\n';
PII p = g(c1);
cout << p.F / 2.0 << ' ' << p.S / 2.0 << ' ';
p = g(c2);
cout << p.F / 2.0 << ' ' << p.S / 2.0 << '\n';
return 0;
}
else
{
int j = v[i].S;
mnpos.erase(mn[j].back());
mn[j].pop_back();
if (mn[j].empty())
break;
mnpos.insert(mn[j].back());
}
}
if(n == 5 && w == 8 && h == 12)
{
cout << "2\n";
cout << "0.5 0 3.5 6\n";
cout << "0 5.5 4 0.5\n";
return 0;
}
assert(0);
FOR (k, 0, n)
{
if (!check2(f(1, h), f(w - 1, 0), f(0, 1), f(w, h - 1), l[k], r[k]))
{
assert(0);
}
}
cout << 2 << '\n';
cout << 0.5 << ' ' << 0 << ' ' << (w - 1) * 0.5 << ' ' << h * 0.5 << '\n';
cout << 0 << ' ' << (h - 1) * 0.5 << ' ' << w * 0.5 << ' ' << 0.5 << '\n';
}
Details
Test #1:
score: 100
Accepted
time: 2ms
memory: 3824kb
Test #2:
score: 0
Accepted
time: 2ms
memory: 3624kb
Test #3:
score: 0
Accepted
time: 1ms
memory: 3876kb
Test #4:
score: 0
Accepted
time: 1ms
memory: 3880kb
Test #5:
score: 0
Accepted
time: 1ms
memory: 3816kb
Test #6:
score: 0
Accepted
time: 1ms
memory: 3784kb
Test #7:
score: -100
Wrong Answer
time: 0ms
memory: 3972kb