double 精度
查看原帖
double 精度
1209877
Vector_Li楼主2024/11/4 19:25

现在的数据是官方数据吗,我考场上写的 double 写法,正式数据 100 分,但有没有可能被卡掉呢?

#include <bits/stdc++.h>
#define long long long

using namespace std;

// 记得清空数组
// 记得处理好 a < 0,同时使出点在 L 前的 cases 

const int N = (int) 1E5;
const int M = (int) 1E5;
const double EPS = 1E-6;

struct node {
	int u, v;
	
	friend bool operator < (node a, node b) {
		return a.v < b.v;
	}
};

int n, m, L;
int d[N];
int p[M];
vector<node> A;

double V;
double v[N], a[N];

void count() {
	A = vector<node>();
	int c = 0;
	
	for (int i = 0; i < n; i++) {
		int x = distance(p, lower_bound(p, p + m, d[i]));
		if (x == m) {
			// 后面没有其他的测速站点了 
			continue;
		} 
		
		// 如果不会超速,就 continue 
		if (abs(a[i]) <= EPS) {
			if (v[i] <= V) {
				continue;
			}
		} else if (a[i] > 0) {
			int s = p[m - 1] - d[i];
			double e = sqrt(v[i] * v[i] + 2 * a[i] * s);
			if (e <= V) {
				continue;
			}
		} else if (a[i] < 0) {
			double t = (0 - v[i]) * v[i] / (2 * a[i]);
			if (d[i] + t < p[x]) {
				continue;
			} 
			int s = p[x] - d[i];
			double e = sqrt(v[i] * v[i] + 2 * a[i] * s);
			if (e <= V) {
				continue;
			}
		} else {
			assert(false);
		}
		
		c = c + 1;
		
		if (abs(a[i]) <= EPS) {
			A.push_back((node) {x, m - 1});
		} else if (a[i] > 0) {
			int low = x, high = m - 1;
			while (low <= high) {
				int center = (low + high) / 2;
				int s = p[center] - d[i];
				double e = sqrt(v[i] * v[i] + 2 * a[i] * s);
				if (e > V) {
					high = center - 1;
				} else {
					low = center + 1;
				}
			}
			A.push_back((node) {low, m - 1});
		} else if (a[i] < 0) {
			double t = (0 - v[i]) * v[i] / (2 * a[i]);
			// 找最后一个可以检查到的摄像头 
			int low = x, high = m - 1;
			while (low <= high) {
				int center = (low + high) / 2;
				int position = p[center];
				
				// 如果根本到不了 
				if (d[i] + t < position) {
					high = center - 1;
				} 
				
				int s = p[center] - d[i];
				double e = sqrt(v[i] * v[i] + 2 * a[i] * s);
				if (e > V) {
					low = center + 1;
				} else {
					high = center - 1;
				}
			}
			A.push_back((node) {x, high});
		} else {
			assert(false);
		}
	}
	
	cout << c << " ";
	
//	cout << "\n";
//	for (int i = 0; i < (int) A.size(); i++) {
//		cout << A[i].u + 1 << " " << A[i].v + 1 << "\n";
//	}
	sort(A.begin(), A.end());
	
	int prev = 0 - 1;
	int count = 0;
	for (int i = 0; i < (int) A.size(); i++) {
		int u = A[i].u, v = A[i].v;
		if (prev < u) {
			count = count + 1;
			prev = v;
		}
	}
	cout << m - count << "\n";
}



void solve() {
	cin >> n >> m >> L >> V;
	for (int i = 0; i < n; i++) {
		cin >> d[i] >> v[i] >> a[i];
	}
	for (int i = 0; i < m; i++) {
		cin >> p[i];
	}
	count();
}

int main() {
	freopen("detect.in", "r", stdin);
	freopen("detect.out", "w", stdout); 
	ios::sync_with_stdio(0);
	cin.tie(nullptr);
	int t;
	cin >> t;
	for (int i = 0; i < t; i++) {
		solve();
	}
	return 0;
} 
2024/11/4 19:25
加载中...