40pts求调
查看原帖
40pts求调
1385717
zwx8998楼主2025/7/31 20:23

注:本苟蒻参考了大佬chenxi2009的题解

40pts求大佬帮debug……qwq

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+5;
struct Node{
	int l,r;
}s[N];
int T,n,m,L,V,d[N],v[N],a[N],p[N];
bool cmp(Node x,Node y){
	return (x.r!=y.r?x.r<y.r:x.l<y.l);
}
int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>T;
	for(int ans,last;T--;){
		ans=last=0; 
		memset(s,0,sizeof(s));
		cin>>n>>m>>L>>V;
		for(int i=1;i<=n;i++)
			cin>>d[i]>>v[i]>>a[i];
		for(int i=1;i<=m;i++)
			cin>>p[i];
		for(int i=1;i<=n;i++){
			const int x=V*V-v[i]*v[i],y=2*a[i];
			int lk,rk,ld,rd;
			if(a[i]>0){
				rd=L,rk=0;
				if(v[i]>=V){
					ld=d[i];
					lk=(v[i]==V);
				}
				else if(d[i]+(x+y-1)/y<=L){
					ld=d[i]+(x+y-1/y);
					lk=(ld==d[i]+x/y);
				}
				else
					continue;
			}
			else if(a[i]<0){
				if(v[i]>V){
					ld=d[i];
					lk=0;
					if(d[i]+x/y>=L){
						rd=L;
						rk=0;
					}
					else{
						rd=d[i]+x/y;
						rk=!(x%y);//-x%y? 
					}
				}
				else
					continue;
			}
			else{
				if(v[i]>V){
					lk=rk=0;
					ld=d[i];
					rd=L;
				}
				else
					continue;
			}
			int l=1,r=m;
			for(;l<r;){
				int mid=l+r>>1;
				if(p[mid]>ld||p[mid]==ld&&!lk)
					r=mid;
				else
					l=mid+1;
			}
			if(p[l]<ld||p[l]>rd||p[l]==ld&&lk||p[l]==rd&&rk)
				continue;
			s[++ans].l=l;
			l=1,r=m;
			for(;l<r;){
				int mid=l+r+1>>1;
				if(p[mid]<rd||p[mid]==rd&&!rk)
					l=mid;
				else
					r=mid-1;
			}
			s[ans].r=l;
		}
		sort(s+1,s+1+ans,cmp);
		for(int i=1;i<=ans;i++)
			if(s[i].l>last){
				last=s[i].r;
				m--;
			}
		cout<<ans<<' '<<m<<'\n';
	}
	return 0;
}
2025/7/31 20:23
加载中...