第3组大样例跑超过20s,但是AC了,这是为什么?
查看原帖
第3组大样例跑超过20s,但是AC了,这是为什么?
349225
AlanCRL楼主2024/11/10 19:39

我在考场上敲了一个 nlognn log n 的代码,然后在用文件测第三组大样例的时候,用了 20s 才跑出正确结果。但是复杂度很对,并且考场是 11 代 i7,按理说不会那么慢的啊,本地也开 -O2 了。后来又在自己电脑上测试也是如此,请问有没有大佬知道这是为什么?

下面是我的代码:

#include <bits/stdc++.h>
using namespace std;

inline int read()
{
	int x = 0, f = 1;
	char c = getchar();
	while (c < '0' || c > '9')
	{
		if (c == '-') f = -1;
		c = getchar();
	}
	while (c >= '0' && c <= '9')
	{
		x = x * 10 + c - 48;
		c = getchar();
	}
	return x*f;
}
inline void write(int x)
{
	if (x < 0) putchar('-'), x = -x;
	if (x > 9) write(x / 10);
	putchar(x % 10 + 48);
}

const int N = 1e5 + 10;

int T;
int n, m, L, V;

int d[N], v[N], a[N];
int p[N];

vector<pair<int, int>> sig;
int ans;

signed main()
{
	T = read();
	while (T--)
	{
		sig.clear();
		ans = 0;

		n = read(), m = read(), L = read(), V = read();

		for (int i = 1; i <= n; i++) d[i] = read(), v[i] = read(), a[i] = read();
		for (int i = 1; i <= m; i++) p[i] = read();

		for (int i = 1; i <= n; i++)
		{
			int idx = lower_bound(p + 1, p + 1 + m, d[i]) - p;
			if (idx > m) continue;

			if (a[i] == 0)
			{
				if (v[i] > V)
				{
					sig.emplace_back(make_pair(idx, m));
				}
			}
			else if (a[i] < 0)
			{
				if (v[i] > V)
				{
					int l = idx, r = m, res = -1;
					while (l <= r)
					{
						int mid = (l + r) >> 1;
						if (v[i] * v[i] + 2 * a[i] * (p[mid] - d[i]) > V * V)
						{
							res = mid;
							l = mid + 1;
						}
						else r = mid - 1;
					}

					if (res != -1)
					{
						sig.emplace_back(make_pair(idx, res));
					}
				}
			}
			else if (a[i] > 0)
			{
				int l = idx, r = m, res = -1;
				while (l <= r)
				{
					int mid = (l + r) >> 1;
					if (v[i] * v[i] + 2 * a[i] * (p[mid] - d[i]) > V * V)
					{
						res = mid;
						r = mid - 1;
					}
					else l = mid + 1;
				}

				if (res != -1)
				{
					sig.emplace_back(make_pair(res, m));
				}
			}
		}

		sort(sig.begin(), sig.end(), [](pair<int, int> a, pair<int, int> b) -> bool
		{
			return a.second < b.second;
		});

		int last = -1;
		for (int i = 0; i < (int)sig.size(); i++)
		{
			if (last < sig[i].first)
			{
				ans++;
				last = sig[i].second;
			}
		}
		write(sig.size()), putchar(' '), write(m - ans), putchar('\n');
	}

	return 0;
}
2024/11/10 19:39
加载中...