90pts WA on #10 求助
查看原帖
90pts WA on #10 求助
993122
xiaorunrun520楼主2024/10/28 18:46

代码如下,跟按考场上的思路写的,大样例全过,现在好怕考场代码爆掉

#include<bits/stdc++.h>
using namespace std;
const int N=100005;
int t,n,m,L,V;
int ans1,ans2,d[N],v[N],a[N],p[N];
struct node{
	int l,r;
}f[N];
bool cmp(node x,node y){
	if(x.r == y.r) return x.l<y.l;
	else return x.r<y.r;
}
void get_ans(){
	sort(f+1,f+ans1+1,cmp);
	int lst=0;
	//for(int i=1;i<=ans1;i++) cout<<f[i].l<<" "<<f[i].r<<endl;
	for(int i=1;i<=ans1;i++){
		if(f[i].l>lst) lst=f[i].r,ans2++;
	}
	printf("%d %d\n",ans1,m-ans2); 
}
void work(){
	ans1=ans2=0;
	scanf("%d%d%d%d",&n,&m,&L,&V);
	for(int i=1;i<=n;i++){
		scanf("%d%d%d",&d[i],&v[i],&a[i]);
	}
	for(int i=1;i<=m;i++){
		scanf("%d",&p[i]);
	}
	for(int i=1;i<=n;i++){
		if(d[i]>p[m]) continue;
		if(v[i]>V && a[i]>=0){
			f[++ans1].l = lower_bound(p+1,p+m+1,d[i])-p;
			f[ans1].r = m;
			
		}
		else if(a[i]>0){
			int dd = floor(1.0*(pow(V,2)-pow(v[i],2))/a[i]/2);
			if(d[i]+dd>=p[m]) continue;
			int pos = lower_bound(p+1,p+m+1,d[i]+dd-1)-p;
			f[++ans1].l = pos,f[ans1].r = m;
		}
		else if(a[i]<0){
			int pos = lower_bound(p+1,p+m+1,d[i])-p;
			if(pow(v[i],2)+2*a[i]*(p[pos]-d[i])<0)continue;
			else{
				if(sqrt(pow(v[i],2)+2*a[i]*(p[pos]-d[i]))<=V) continue;
			}
			int dd = ceil(1.0*(pow(V,2)-pow(v[i],2))/a[i]/2);
			f[++ans1].l=pos;
			pos = lower_bound(p+1,p+m+1,d[i]+dd)-p-1;
			f[ans1].r=pos;
		}
	}
	get_ans();
}
int main(){
	//freopen("detect1.in","r",stdin);
	//freopen("ans.ans","w",stdout);
	scanf("%d",&t);
	while(t--){
		work();
	}
	return 0;
}
2024/10/28 18:46
加载中...