我在考场上敲了一个 nlogn 的代码,然后在用文件测第三组大样例的时候,用了 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;
}