QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#165484#2434. Single Cut of FailurePetroTarnavskyi#WA 2ms3984kbC++172.3kb2023-09-05 18:40:462023-09-05 18:40:47

Judging History

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

  • [2023-09-05 18:40:47]
  • 评测
  • 测评结果:WA
  • 用时:2ms
  • 内存:3984kb
  • [2023-09-05 18:40:46]
  • 提交

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;
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 2 * y;
	if (y == h) return 2 * (h + x);
	if (x == w) return 2 * (h + w + h - y);
	return 2 * (h + h + w + w - x);
}

int getSide(int c)
{
	if (c < 2 * h) return 0;
	if (c < 2 * (h + w)) return 1;
	if (c < 2 * (h + w + h)) return 2;
	if (c < 2 * (h + w + h + w)) return 3;
	assert(0);
}

void g(int c)
{
	if (c < 2 * h) cout << 0 << ' ' << h - (c / 2.0);
	else if (c < 2 * (h + w)) cout << (c - 2 * h) / 2.0 << ' ' << 0;
	else if (c < 2 * (h + w + h)) cout << w << ' ' << (c - 2 * (h + w)) / 2.0;
	else if (c < 2 * (h + w + h + w)) cout << w - (c - 2 * (h + w + h)) / 2.0 << ' ' << h;
	else
		assert(0);
}


int coor[4];


int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	int n;
	cin >> n >> w >> h;
	
	coor[0] = h;
	coor[1] = h + w;
	coor[2] = h + w + h;
	coor[3] = 0;
	
	vector<PII> v(2 * n);
	vector<VI> mn(n);
	FOR (i, 0, n)
	{
		int x1, y1, x2, y2;
		cin >> x1 >> y1 >> x2 >> y2;
		y1 = h - y1;
		y2 = h - y2;
		v[2 * i] = {f(x1, y1), i};
		v[2 * i + 1] = {f(x2, y2), i};
	}
	sort(ALL(v));
	
	FOR (i, 0, 2 * n)
	{
		v.PB(v[i]);
		mn[v[i].S].PB(i);
		mn[v[i].S].PB(i + 2 * n);
	}
	FOR (i, 0, n)
		sort(ALL(mn[i]), greater());
	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;
			if (getSide(c1) == getSide(c2))
				c2 = 2 * coor[getSide(c2)] + 1;
			cout << 1 << '\n';
			g(c1);
			cout << ' ';
			g(c2);
			cout << '\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());
		}
	}
	cout << 2 << '\n';
	cout << 0.5 << ' ' << 0  << ' ' << w - 0.5 << ' ' << h << '\n';
	cout << h - 0.5 << ' ' << 0 << ' ' << w << ' ' << 0.5 << '\n';
}



详细

Test #1:

score: 100
Accepted
time: 2ms
memory: 3984kb

Test #2:

score: -100
Wrong Answer
time: 2ms
memory: 3940kb