10pts 求调
查看原帖
10pts 求调
1045879
cheng2010楼主2024/11/7 12:39
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e6+7;
ll T;
ll sum[N];
ll n,m,len,xs;
struct Node
{
	ll d,add,st;
	ll l,r;
}a[N];
struct Qu
{
	ll l,r;
}b[N];
bool cmp(Qu A,Qu B)
{
	return A.l<B.l;
}
ll p[N];
ll ans1,ans2;
ll Q(ll l,ll r)
{
	ll res=sum[r];
	if(l!=0) res-=sum[l-1];
	return res;
}
ll t[N],top;
void solve()
{
	ans1=ans2=top=0;
	for(ll i=1;i<=len;i++)
		sum[i]=0;
	scanf("%lld %lld %lld %lld",&n,&m,&len,&xs);
	//----------------------------------------------------------------------------------------------------
	//求超速区间 
	for(ll i=1;i<=n;i++)
	{
		scanf("%lld %lld %lld",&a[i].d,&a[i].st,&a[i].add);
		if(a[i].add>0)
		{
			if(a[i].st>xs)
			{
				a[i].l=a[i].d;
				a[i].r=len;
				continue;
			}
			ll A=(xs*xs-a[i].st*a[i].st);
			ll B=2*a[i].add;
			ll di=A/B+1+a[i].d;
			if(di>len) a[i].l=a[i].r=-1;
			else a[i].l=di,a[i].r=len;
		}
		else if(a[i].add==0)
		{
			if(a[i].st>xs) a[i].l=a[i].d,a[i].r=len;
			else a[i].l=a[i].r=-1;
		}
		else
		{
			if(a[i].st<=xs)
			{
				a[i].l=a[i].r=-1;
				continue;
			}
			ll A=(xs*xs-a[i].st*a[i].st);
			ll B=2*a[i].add;
			ll di=A/B+a[i].d;
			if(A%B==0) di--;
			if(di>len)
			{
				a[i].l=a[i].d;
				a[i].r=len;
			}
			else
			{
				a[i].l=a[i].d;
				a[i].r=di;
			}
		}
	}
	//----------------------------------------------------------------------------------------------------
	//求能否被检测到 
	for(ll i=1;i<=m;i++)
	{
		scanf("%lld",&p[i]);
		sum[p[i]]++;
	}
	for(ll i=1;i<N;i++)
		sum[i]+=sum[i-1];
	for(ll i=1;i<=n;i++)
	{
		if(~a[i].l)
		{
			if(Q(a[i].l,a[i].r))
			{
//				b[++ans1].l=a[i].l;
//				b[ans1].r=a[i].r;
				ll l=a[i].l,r=a[i].r;
				ll id=0;
				ans1++;
				while(l<=r)
				{
					ll mid=(l+r)>>1;
					if(Q(l,mid))
					{
						id=mid;
						r=mid-1;
					}
					else
					{
						l=mid+1;
					}
				}
				b[ans1].l=id;
				l=a[i].l,r=a[i].r;
				id=0;
				while(l<=r)
				{
					ll mid=(l+r)>>1;
					if(Q(mid,r))
					{
						id=mid;
						l=mid+1;
					}
					else
					{
						r=mid-1;
					}
				}
				b[ans1].r=id;
			}
		}
	}
	sort(b+1,b+1+ans1,cmp);
	//贪心 
	if(ans1)
	{
		ll Min=b[1].r;ans2=1;
		for(ll i=2;i<=ans1;i++)
		{
			if(Min<b[i].l)
			{
				t[++top]=Min;
				ans2++;
				Min=b[i].r;
			}
			else
			{
				Min=min(Min,b[i].r);
			}
		}
	}
	printf("%lld %lld\n",ans1,m-ans2);
}
int main()
{
	scanf("%lld",&T);
	while(T--) solve();
}
2024/11/7 12:39
加载中...