社区讨论

90pts WA on#10 求调或hack

P11232[CSP-S 2024] 超速检测参与者 5已保存回复 10

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
10 条
当前快照
1 份
快照标识符
@m2xb0gkl
此快照首次捕获于
2024/10/31 20:50
去年
此快照最后确认于
2025/11/04 15:38
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+10;
struct qq{
	ll d,v,l,r,a;
}car[N];
ll p[N];
ll t;
ll n,m,L,V;
bool cmp(qq x,qq y){
	if(x.r!=y.r)return x.r<y.r;
	else return x.l<y.l;
}
int main(){
// 	freopen("detect5.in","r",stdin);
// 	freopen("out.txt","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0); 
	cin>>t;
	while(t--){
		
		cin>>n>>m>>L>>V;
		for(int i=1;i<=n;++i){
			cin>>car[i].d>>car[i].v>>car[i].a;
			car[i].l=car[i].r=1e9;
		}
		for(int i=1;i<=m;++i){
			cin>>p[i];
		}
		int ans1=0;
		for(int i=1;i<=n;++i){
			if(car[i].d>p[m])continue;
			if(car[i].a>0){
				ll vmo=(car[i].a*2*(p[m]-car[i].d)+car[i].v*car[i].v);
				if(vmo>V*V){
					long double dd=(V*V*1.0-car[i].v*car[i].v*1.0)/(2*car[i].a*1.0);
					dd=dd+car[i].d*1.0;
					ans1++;
					int l=1,r=m,mid;
					while(l<r){
//						cout<<"OK";
						mid=(l+r)>>1;
						if(p[mid]>dd)r=mid;
						else l=mid+1;
					}
					if(dd==p[l]*1.0)l++;
					car[i].l=l;
					car[i].r=m;
				}
			}
			else if(car[i].a<0){
				if(car[i].v<=V)continue;
				int l=1,r=m+1,mid;
				while(l<r){
					mid=(l+r)>>1;
					if(p[mid]>=car[i].d)r=mid;
					else l=mid+1;
				}
				ll vmo=(car[i].a*2*(p[l]-car[i].d)+car[i].v*car[i].v);
				if(vmo>V*V){
					long double dd=(V*V*1.0-car[i].v*car[i].v*1.0)/(car[i].a*2*1.0);
					dd=dd+car[i].d*1.0;
					ans1++;
					car[i].l=l;
					r=m+1;
					while(l<r){
						
						mid=(l+r+1)>>1;
						if(p[mid]>dd)r=mid-1;
						else l=mid;
					}
					if(p[l]*1.0==dd)l--;
					car[i].r=l;
				}
			}
			else{
				if(car[i].v>V){
					int l=1,r=m,mid;
					while(l<r){
						mid=(l+r)>>1;
						if(p[mid]>=car[i].d)r=mid;
						else l=mid+1;
					}
					ans1++;
					car[i].l=l;
					car[i].r=m;
				}
				
			}
		}
		cout<<ans1<<" ";
		sort(car+1,car+1+n,cmp);
		int ans2=0;
		if(car[1].l!=1e9){
			ll mi=0;
			for(int i=1;i<=n;++i){
				if(car[i].r==1e9)break;
				if(car[i].a<0)continue;
				mi=max(mi,car[i].l);
			}
			ll mx=0;
			bool cu=0;
			for(int i=1;i<=n;++i){
				if(car[i].r==1e9)break;
				if(car[i].a>=0)continue;
				if(!cu){
					cu=1;
					ans2++;
					mx=car[i].r;
					continue;
				}
				if(car[i].l>mx){
					ans2++;
					mx=car[i].r;
				}
			}
			if(mx<mi)ans2++;
		}
		cout<<m-ans2<<"\n";
	}
}

回复

10 条回复,欢迎继续交流。

正在加载回复...