玄关求调
查看原帖
玄关求调
1404971
BUMIE楼主2024/11/22 23:40

玄关求调

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5;
int t;
int n,m,L,s;
struct car{
	int x,s,y;
	int l,r;
}a[N];
int x[N];
int work(int k){
	int pos=lower_bound(x+1,x+m+1,k)-x;
	return pos;
}
int work2(int k){
	int pos=lower_bound(x+1,x+m+1,k)-x-1;
	return pos;
}
bool cmp(car x,car y){
	return x.r<y.r;
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin>>t;
	while(t--){
		cin>>n>>m>>L>>s;
		for(int i=1;i<=n;i++){
			cin>>a[i].x>>a[i].s>>a[i].y;
			a[i].r=-1;
			a[i].l=0;
		}
		for(int i=1;i<=m;i++){
			cin>>x[i];
		}
		int ans=0;
		for(int i=1;i<=n;i++){
			if(a[i].y==0){
				if(a[i].s>s){
					a[i].l=work(a[i].x);
					if(a[i].l!=-1){
						a[i].r=m;
					}
				}
			}else if(a[i].y<0){
				if(a[i].s>s){
					a[i].l=work(a[i].x);
					a[i].r=work2(a[i].x+(s*s-a[i].s*a[i].s)/2.0/a[i].y);
				}
			}else{
				a[i].l=work2(a[i].x+(s*s-a[i].s*a[i].s)/2.0/a[i].y);
				if(a[i].l!=-1){
					a[i].r=m;
				}
			}
//			cout<<a[i].l<<" "<<a[i].r<<"\n";
			if(a[i].r-a[i].l+1>=1) ans++;
		}
		sort(a+1,a+n+1,cmp);
		int sum=0,r=-1e9;
		for(int i=1;i<=n;i++){
			if(a[i].r-a[i].l+1<1) continue;
			if(r<a[i].l){
				r=a[i].r;
				sum++;
			}
		}
		cout<<ans<<" "<<m-sum<<"\n";
	}
	return 0;
}
2024/11/22 23:40
加载中...