玄关)bx 求大佬帮调,已经调疯了
查看原帖
玄关)bx 求大佬帮调,已经调疯了
732565
_HCNX_楼主2024/11/20 10:05

RT orzorz

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10,M=1e6+10;
ll T,n,m,L,V,p[N],tr[M][2];
int ans,cnt;
struct car{
	ll d,v,a;
}c[N];
struct lc{
	ll l,r;
}cl[N];
bool cmp(lc x,lc y){
	if(x.r!=y.r) return x.r<y.r;
	return x.l<y.l;
}
int lowbit(int x){
	return x&(-x);
}
void add(int x,int t){
	while(x<=L+5){
		++tr[x][t];
		x+=lowbit(x);
	}
}
int query(int x,int t){
	int res=0;
	while(x>0){
		res+=tr[x][t];
		x-=lowbit(x);
	}
	return res;
}
int main(){
//	freopen("detect.in","r",stdin);
//	freopen("detect.out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cin>>T;
	while(T--){
		memset(tr,0,sizeof tr);
		ans=cnt=0;
		cin>>n>>m>>L>>V;
		++L;
		for(int i=1;i<=n;++i) {
			cin>>c[i].d>>c[i].v>>c[i].a;
			++c[i].d;
		}
		for(int i=1;i<=m;++i){
			cin>>p[i];
			++p[i];
			add(p[i],0);
		}
		ll res,d,v,a,l,r;
		for(int i=1;i<=n;++i){
			if(c[i].v<=V&&c[i].a<=0)continue;
			d=c[i].d,v=c[i].v,a=c[i].a;
			if(v>V&&a>=0){
				l=d;
				r=L;
			}
			else{
				if(a<0){
					res=ceil((double)(V*V-v*v)/(2*a)-1);
					l=d;
					r=min(d+res,L);
				}
				else {
					res=floor((double)(V*V-v*v)/(2*a)+1);
					if(d+res>L) continue;
					l=d+res;
					r=L;
				}
			}
			if(query(r,0)-query(l-1,0)>0){
				cl[++cnt]={l,r};
				//cout<<i<<" "; 
			}
		}
		//cout<<endl;
		sort(cl+1,cl+1+cnt,cmp);
		for(int i=1;i<=cnt;++i){
			if((query(cl[i].r,1)-query(cl[i].l-1,1))==0){
				add(cl[i].r,1);
				++ans;
			}
		}
		cout<<cnt<<" "<<m-ans<<"\n";
	}
	cout<<endl;
	return 0;
}

2024/11/20 10:05
加载中...