40pts求调
查看原帖
40pts求调
816204
Light_LE楼主2024/11/9 23:33

这是我考场上的代码,实在不知道该怎么改

// 2024 CSP-S 40pts
#include <bits/stdc++.h>
#define maxn 100003
#define fin cin
#define fout cout
using namespace std;
int T, n/*车辆数*/, m/*测速仪数*/, L/*公路长度*/, V/*限速*/, p[1000003], cnt_cars/*超速车辆*/;
//int cnta_0, cnta_up, cnta_down;
int main() {
	//ifstream fin("light.in");
	//ofstream fout("light.out");
	ios::sync_with_stdio(0); fin.tie(0); fout.tie(0);

	fin >> T;
	while (T--) {
		//init
		struct Data {
			int d/*开始位置*/, v/*初始速度*/, a/*加速度*/;
		}data[maxn];
		cnt_cars = 0/*超速车辆*/;// cnta_0 = 0, cnta_up = 0, cnta_down = 0;
		
		fin >> n >> m >> L >> V;
		for (int i = 0; i < n; i++) {
			fin >> data[i].d >> data[i].v >> data[i].a;
			/*
			if (data[i].a == 0) {
				cnta_0++;
			}
			if (data[i].a > 0) {
				cnta_up++;
			}
			if (data[i].a < 0) {
				cnta_down++;
			}*/
		}
		for (int i = 1; i <= m; i++) {
			fin >> p[i];
		}
		
		//======//
		/*
		if (cnta_0 == n) {
			for (int i = 0; i < n; i++) {
				if (data[i].d > p[m]) {
					continue;
				}
				
				if (data[i].v > V) {
					cnt_cars++;
				}
			} 
			fout << cnt_cars << " " << m - 1 << endl;
			continue;
		}
		else if (cnta_up == n) {
			for (int i = 0; i < n; i++) {
				if (data[i].d > p[m]) {
					continue;
				}
				
				int s = p[m] - data[i].d;
				if (data[i].v > V) {
					cnt_cars++;
				}
				else if ((double)(sqrt(pow(data[i].v, 2) + 2 * data[i].a * s)) > (double)V) {
					cnt_cars++; 
				}
			}
			fout << cnt_cars << " " << m - 1 << endl;
			continue;
		}
		else if (cnta_down == n) {
			int cnt_p = 0;
			set<int> vis;
			for (int i = 0; i < n; i++) {
				if (data[i].d > p[m] || data[i].v <= V) {
					continue;
				}
				
				int index = upper_bound(p, p + m, data[i].d) - p;// TLE 风险 
				if (p[index - 1] == data[i].d) {// 在测速仪上 
					index--;
				}
				int s = p[index] - data[i].d;
				
				if ((double)(sqrt(pow(data[i].v, 2) + 2 * data[i].a * s)) > (double)V) {
					cnt_cars++;
					if (vis.count(index) == 0) {
						cnt_p++;
					}
					vis.insert(index);
				}
			}
			fout << cnt_cars << " " << m - cnt_p << endl;
			continue;
		}
		*/
		if (0) {
			
		}
		else {
			int cnt_p = 0;
			set<int> vis;
			for (int i = 0; i < n; i++) {
				if (data[i].a == 0) {
					if (data[i].d > p[m]) {
						continue;
					}
					
					if (data[i].v > V) {
						cnt_cars++;
						if (vis.count(m) == 0) {
							cnt_p++;
						}
						vis.insert(m);
					}
				}
				if (data[i].a > 0) {
					if (data[i].d > p[m]) {
						continue;
					}
					
					int s = p[m] - data[i].d;
					if (data[i].v > V) {
						cnt_cars++;
						if (vis.count(m) == 0) {
							cnt_p++;
						}
						vis.insert(m);
					}
					else if ((double)(sqrt(pow(data[i].v, 2) + 2 * data[i].a * s)) > (double)V) {
						cnt_cars++; 
						if (vis.count(m) == 0) {
							cnt_p++;
						}
						vis.insert(m);
					}
				}
				if (data[i].a < 0) {// 有 BUG 
					if (data[i].d > p[m] || data[i].v <= V) {
						continue;
					}
					
					int index = upper_bound(p, p + m, data[i].d) - p;// TLE 风险 
					if (p[index - 1] == data[i].d) {// 生成在测速仪上 
						index--;
					}
					
					int s = p[index] - data[i].d;
					
					if ((double)(sqrt(pow(data[i].v, 2) + 2 * data[i].a * s)) > (double)V) {
						cnt_cars++;
						if (vis.count(index) == 0) {
							cnt_p++;
						}
						vis.insert(index);
					}
				} 
			}
			fout << cnt_cars << " " << m - cnt_p << endl;
		}
	}
	return 0;
}
2024/11/9 23:33
加载中...