0分RE加WA求条
查看原帖
0分RE加WA求条
573963
wbh20090611楼主2024/10/31 19:45

O(NlogN)O(N log N)

#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int n, m, L, V, T, d[N], v[N], a[N], p[N], l[N], r[N], len, maxn, minn, ans, cnt;
int main()
{
	cin >> T;
	while(T--)
	{
		scanf("%d%d%d%d", &n, &m, &L, &V);
		vector <int> f[L + 5];
		for (int i = 1; i <= n; i++)
			scanf("%d%d%d", d + i, v + i, a + i);
		for (int i = 1; i <= m; i++)
			scanf("%d", p + i);
		for (int i = 1; i <= n; i++)
			l[i] = r[i] = L + 1;
		for (int i = 1; i <= n; i++)
		{
			if (a[i] == 0 && v[i] > V)
			{
				l[i] = d[i];
				r[i] = L + 1;
			}
			else if (a[i] > 0 && v[i] > V)
			{
				l[i] = d[i];
				r[i] = L + 1;
			}
			else if (a[i] > 0)
			{
				l[i] = d[i] + floor((V - v[i]) * 1.0 / a[i]) + 1;
				r[i] = L + 1; 
			}
			else if (a[i] < 0 && v[i] > V)
			{
				l[i] = d[i];
				r[i] = d[i] + floor((V - v[i]) * 1.0 / a[i]);
			}
		}
		for (int i = 1; i <= n; i++)
			f[r[i]].push_back(l[i]);
		len = 0;
		for (int i = 1; i <= L; i++)
			for (auto j : f[i])
				l[++len] = j, r[len] = i;
		minn = -1;
		maxn = -1;
		ans = 0;
		cnt = 0;
		r[n + 1] = L + 1;
		for (int i = 1, kk; i <= n; i++)
		{
			maxn = max(maxn, r[i]);
			if (minn < l[i])
			{
				kk = upper_bound(p + 1, p + 1 + m, r[i]) - p - 1;
				if (p[kk] < l[i])
				{
					cnt++;
					continue;
				}
				minn = p[kk];
			}
			ans++;
		}
		printf("%d %d\n", n - cnt, ans);
	}
}
2024/10/31 19:45
加载中...