关于 CCF 神奇的数据
查看原帖
关于 CCF 神奇的数据
551428
ainivolAGEM楼主2024/11/5 16:46

rt,考场上没过性质 A,但是事实证明第 991010 点都过了。

所以说啊!CCF 的数据就没让我失望过!

顺手放出 8080 代码求条 qwq。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+4;
const int L=1e6+4;
const int inf=1e9;
ll t,n,m,l,V;
ll a1,a2,p[N];
ll ner1[L],ner2[L];
struct node{
	ll d,v,a;
	ll t1,t2;
}c[N];
bool cmp(node x,node y){
	return x.t2<y.t2;
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>t;
	while(t--){
		cin>>n>>m>>l>>V;
		for(int i=1;i<=n;i++){
			cin>>c[i].d>>c[i].v>>c[i].a;
			c[i].t1=c[i].t2=0;
		}
		for(int i=1;i<=m;i++){
			cin>>p[i];
		}
		a1=a2=0;
		ll lst=inf,id=m;
		for(int i=l;i>=1;i--){
			if(p[id]==i){
				id--;
				lst=i;
			}
			ner1[i]=lst;
		}
		lst=-inf;
		id=1;
		for(int i=1;i<=l;i++){
			if(p[id]==i){
				id++;
				lst=i;
			}
			ner2[i]=lst;
		}
		for(int i=1;i<=n;i++){
			if(c[i].a==0){
				if(c[i].v>V&&c[i].d<=p[m]){
					a1++;
					c[i].t1=c[i].d;
					c[i].t2=l;
				}
			}
			if(c[i].a>0){
				ll dis=V*V-c[i].v*c[i].v;
				if(dis<0&&c[i].d<=p[m]){
					a1++;
					c[i].t1=c[i].d;
					c[i].t2=l;
					continue;
				}
				if(dis==0&&c[i].d<p[m]){
					a1++;
					c[i].t1=c[i].d+1;
					c[i].t2=l;
					continue;
				}
				if(c[i].d*2*c[i].a+dis<p[m]*2*c[i].a){
					a1++;
					c[i].t1=c[i].d+(dis/(2*c[i].a))+1;
					c[i].t2=l;
				}
			}
			if(c[i].a<0){
				if(c[i].v>V){
					ll dis=V*V-c[i].v*c[i].v;
					if(c[i].d*2*c[i].a+dis<=ner1[c[i].d]*2*c[i].a){
						a1++;
						c[i].t1=c[i].d;
						if((-dis)%(-2*c[i].a)!=0){
							c[i].t2=c[i].d+(dis/(2*c[i].a));
						}else{
							c[i].t2=c[i].d+(dis/(2*c[i].a))-1;
						}
						c[i].t2=min(c[i].t2,l);
					}
				}
			}
		}
		sort(c+1,c+n+1,cmp);
		lst=0;
		for(int i=1;i<=n;i++){
			if(!c[i].t1&&!c[i].t2){
				continue;
			}
			if(lst<c[i].t1){
				lst=ner2[c[i].t2];
				a2++;
			}
		}
		cout<<a1<<' '<<m-a2<<'\n';
	}
	return 0;
}
2024/11/5 16:46
加载中...