社区讨论

80pts 求调 wrong on #8 and #10

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

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@m2u9efgi
此快照首次捕获于
2024/10/29 17:42
去年
此快照最后确认于
2025/11/04 15:44
4 个月前
查看原帖
CPP
#include <iostream>
#include <cmath>
#include <algorithm>
#define maxn 100001
using namespace std;
struct car{
	int d,v,a;
}s[maxn];
struct que{
	int l,r,op;
}q[maxn];
int n,m,l,v,t,ans,lamp[maxn];
void pre(){
	int i;
	ans=0;
	cin>>n>>m>>l>>v;
	for(i=1;i<=n;i++){
		cin>>s[i].d>>s[i].v>>s[i].a;
	}
	for(i=1;i<=m;i++){
		cin>>lamp[i];
	}
}
int check(int p){
	int l=1,r=m,mid;
	while(l!=r){
		mid=(l+r)>>1;
		if(lamp[mid]>p) r=mid;
		else if(lamp[mid]<p) l=mid+1;
		     else return mid;
	}
	return l;
}
bool cmp(que a,que b){
	if(a.l==b.l) return a.r<b.r;
	return a.l>b.l;
}
void solve(){
	int i,j,k;
	for(i=1;i<=n;i++){
		if(s[i].d>lamp[m]) continue;
		if(s[i].a>0){
			if(s[i].v>v){
				ans++;
				q[ans].l=check(s[i].d),q[ans].r=m;
			}
			else{
				if(v==s[i].v) j=s[i].d+1;
				else j=(v*v-s[i].v*s[i].v)/(2*s[i].a)+1+s[i].d;
				if(j<=lamp[m]){
					ans++;
					q[ans].l=check(j),q[ans].r=m;
				}
			}
		}
		if(s[i].a==0){
			if(s[i].v>v){
				ans++;
				q[ans].l=check(s[i].d),q[ans].r=m;
			}
		}
		else{
			if(s[i].v>v){
				//cout<<i<<"\n";
				j=check(s[i].d);
				k=(double)((double)(v*v-s[i].v*s[i].v)/(double)(2*s[i].a))+(double)0.99999999999+(double)s[i].d;
				//cout<<j<<" "<<k<<"\n";
				if(lamp[j]<k){
					ans++;
					q[ans].l=j;
					j=check(k);
					if(lamp[j]>=k) j--;
					q[ans].r=j;
				}
			}
		}
	}
	if(ans==0){
		cout<<"0 "<<m<<"\n";
		return;
	}
	sort(q+1,q+ans+1,cmp);
	//cout<<"lamp"<<endl;
	for(i=1,j=m+1;i<=ans;i++){
		//cout<<"que "<<q[i].l<<" "<<q[i].r<<"\n";
		if(j>q[i].r){
			j=q[i].l;
			m--;
			//cout<<j<<endl;
		}
	}
	cout<<ans<<" "<<m<<"\n";
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
    cin>>t;
    while(t--){
    	pre();
    	solve();
	}
}
错了 #8 (a<0) 的情况 感觉是那一部分写假了,但找不到问题,求调。

回复

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

正在加载回复...