TLE 求调
查看原帖
TLE 求调
591561
Xianzi_楼主2024/11/7 16:04

40pts ,求调

#include "bits/stdc++.h"
using namespace std;
struct node{
   int d, v, a;
   bool operator< (const node &x) const{return d < x.d;};
} car[100005], up1[100005], up2[100005];
int t, n, m, L, v;
int ans1, ans2;
int p[100005];
int main(){
   ios::sync_with_stdio(0);
   cin.tie(0);
   cout.tie(0);
   cin >> t;
   while (t--){
   	ans1 = 0, ans2 = 0;
   	cin >> n >> m >> L >> v;
   	for (int i = 1; i <= n; i++)
   		cin >> car[i].d >> car[i].v >> car[i].a;
   	for (int i = 1; i <= m; i++) cin >> p[i];
   	for (int i = 1; i <= n; i++){
   		if (car[i].d > p[m]) continue;
   		if (car[i].a >= 0){
   			double vv = sqrt(car[i].v * car[i].v + 2 * car[i].a * (p[m] - car[i].d));
   			if (vv > 1.0 * v) up1[ans1++] = {car[i].d, car[i].v, car[i].a};
   		}
   		else {
   			int l = 1, r = m;
   			while (l < r){
   				int mid = (l + r) >> 1;
   				if (p[mid] < car[i].d) l = mid + 1;
   				else r = mid;
   			}
   			double vv = sqrt(car[i].v * car[i].v + 2 * car[i].a * (p[l] - car[i].d));
   			if (vv > 1.0 * v) up2[ans2++] = {car[i].d, car[i].v, car[i].a};
   		}
   	}
   	sort(up2, up2 + ans2 + 1);
   	int mn = m + 1, res = 0, cnt = 0;
   	up2[ans2 + 1].d = L + 1;
   	for (int i = 1; i <= ans2; i++){
   		double dist = (v * v - car[i].v * car[i].v) * 1.0 / (2 * up2[i].a) + up2[i].d;
   		int l = 1, r = m + 1;
   		while (l < r){
   			int mid = (l + r) >> 2;
   			if (p[mid] < dist) l = mid + 1;
   			else r = mid; 
   		}
   		mn = min(mn, l - 1);
   		if (p[mn] < up2[i + 1].d)
   			res = mn, mn = m + 1, cnt++;
   	}
   	for (int i = 1; i <= ans1; i++){
   		if (up1[i].d > p[res]) {cnt++; break;}
   		double vv = sqrt(up1[i].v * up1[i].v + 2 * up1[i].a * (p[res] - up1[i].d));
   		if (vv <= v) {cnt++; break;}
   	}
   	cout << ans1 + ans2 << " " << m - cnt << "\n";
   }
   return 0;
}
2024/11/7 16:04
加载中...