40分样例5没过求调
查看原帖
40分样例5没过求调
740332
RobinZheng楼主2024/10/27 17:07

代码: 555

#include<bits/stdc++.h>
using namespace std;
#define int long long
int f[100005];
int ff[100005][2];
int c[1000005];
int p[100005];
int vis[100005];
struct edge{
	int l,r,id;
};
edge fc[100005];
bool cmp(edge x,edge y){
	return x.r<y.r;
}
signed main(){
	int t;
	scanf("%lld",&t);
	while(t--){
		int n,m,L,V;
		int k=0,kk=0;
		scanf("%lld%lld%lld%lld",&n,&m,&L,&V);
		memset(c,0,sizeof(c));
		memset(vis,0,sizeof(vis));
		for(int i=1;i<=n;i++){
			int d,v,a;
			scanf("%lld%lld%lld",&d,&v,&a);
			if(a==0){
				if(v>V) f[++k]=d-1;
				else {
					ff[++kk][0]=-1;
					ff[kk][1]=-1;
				}
			}
			else if(a>0){
				int len=max((long long)floor((V*V-v*v)/(2*a)),0LL);
				f[++k]=min(L,len+d);
			}
			else{
				int len=max((long long)floor((V*V-v*v)/(2*a))+1,0LL);
				ff[++kk][0]=d;
				ff[kk][1]=min(L+1,len+d);
			}
		}
		for(int i=1;i<=m;i++){
			int x;
			scanf("%lld",&x);
			c[x]=1;
			p[i]=x;
		}
		sort(p+1,p+m+1);
		int tt=0,cntt=0;
		for(int i=1;i<=L+1;i++) c[i]+=c[i-1];
		for(int i=1;i<=k;i++) {
			if(c[f[i]]<m) tt=max(tt,f[i]),cntt++;
		} 
		for(int i=1;i<=kk;i++) {
			fc[i].l=ff[i][0];
			fc[i].r=ff[i][1];
			fc[i].id=i;
		}
		for(int i=1;i<=kk;i++){
			if(c[ff[i][1]-1]-c[ff[i][0]-1]>0){
				vis[i]=1;
				cntt++;
			}
		}
//		for(int i=1;i<=kk;i++) cout<<ff[i][0]<<" "<<ff[i][1]<<" "<<vis[i]<<endl;

		sort(fc+1,fc+kk+1,cmp);
		int last=0,cnt=0;
		for(int i=1;i<=kk;i++){
			if(vis[fc[i].id]==1){
				if(p[last]<fc[i].l){
					while(p[last]<fc[i].r&&last<=m) last++;
					last--;
					cnt++;
				}
			}
		}
		if(p[last]<=tt) cnt++;
		cout<<cntt<<" "<<m-cnt<<endl;
	}
	
	return 0;
} 
2024/10/27 17:07
加载中...