厌氧代码,开O2全RE不开全AC,为什么会这样(
查看原帖
厌氧代码,开O2全RE不开全AC,为什么会这样(
705435
Velkhana楼主2024/8/21 13:07

代码如下

#include <cstdio>
#include <queue>
#include <cstring>
#define min(A, B) (A < B ? A : B)
#define abs(x) (x < 0 ? -(x) : x)
#define lowbit(x) (x & -x)

const int MX = 20;

double x[MX], y[MX];

namespace DP
{
int f[1 << MX], sht[MX][MX];
bool vis[1 << MX];

std::pair <double, double> fun(double x1, double y1, double x2, double y2)
{
	double a = (x2 * y1 - x1 * y2) / (x1 * x2 * (x1 - x2));
	return { a, (y1 - x1 * x1 * a) / x1 };
}

inline bool equal(double a, double b)
{
	return abs(a - b) < 1e-7;
}

void exec(int n)
{
	std::pair <double, double> pr;
	for (int i = 0; i < n; i++)
	{
		sht[i][i] = 1 << i;
		for (int j = i + 1; j < n; j++)
		{
			pr = fun(x[i], y[i], x[j], y[j]);
			sht[i][j] = 0;
			if (pr.first < 0)
			{
				for (int k = 0; k < n; k++)
				{
					if (equal(pr.first * x[k] * x[k] + pr.second * x[k], y[k]))
					{
						sht[i][j] |= (1 << k);
					}
				}
			}
		}
	}
}

inline void minx(int& a, int b)
{
	a = min(a, b);
}

int DP(int n)
{
	memset(f, 0x3f, sizeof(int) * (1 << n));
	memset(vis, 0, sizeof(bool) * (1 << n));
	exec(n);
	std::queue <int> q;
	q.push((1 << n) - 1);
	f[(1 << n) - 1] = 0;
	vis[0] = true;
	int t;
	while (not q.empty())
	{
		t = q.front();
		q.pop();
		for (int i, t1 = t; (i = __builtin_ctz(t1)), t1; t1 -= lowbit(t1))
		{
			for (int j, t2 = t1; (j = __builtin_ctz(t2)), t2; t2 -= lowbit(t2))
			{
				minx(f[t & (~sht[i][j])], f[t] + 1);
				if (not vis[t & (~sht[i][j])])
				{
					vis[t & (~sht[i][j])] = true;
					q.push(t & (~sht[i][j]));
				}
			}
		}
	}
}
}

int main()
{
	int t, n;
	scanf("%d", &t);
	while (t--)
	{
		scanf("%d%*d", &n);
		for (int i = 0; i < n; i++)
		{
			scanf("%lf%lf", x + i, y + i);
		}
		DP::DP(n);
		printf("%d\n", DP::f[0]);
	}
}

RE信息

Runtime Error.
Received signal 6: Aborted / IOT trap.
2024/8/21 13:07
加载中...