90 Pts WA on #6 求求求求条条条条
查看原帖
90 Pts WA on #6 求求求求条条条条
735416
Wy_x楼主2025/8/2 10:32

rrrrtttt.

求求求求条条条条


#include<bits/stdc++.h>
#define int long long

using namespace std;

inline int read()
{
	int x=0,c=getchar(),f=0;
	for(;c>'9'||c<'0';f=c=='-',c=getchar());
	for(;c>='0'&&c<='9';c=getchar())
		x=(x<<1)+(x<<3)+(c^48);
	return f?-x:x;
}
inline void write(int x)
{
	if(x<0) x=-x,putchar('-');
	if(x>9)  write(x/10);
	putchar(x%10+'0');
}


const int N=1<<20;
int n,m,L,V;
struct Node{
	int d,v,a;
}a[N];
int p[N];

struct Ans{
	int l,r;
}ans[N];
int cnt=0;

void solve(Node nw)
{
	int d=nw.d,v=nw.v,a=nw.a;
	if(a==0)
	{
		if(v>V&&d<=p[m])
        {
        	int nw=0;
            for(int k=18;k>=0;k--)
            {
                int to=nw+(1<<k);
                if(to>m) continue;
                if(p[to]<d) nw=to;
            }
            nw++;
            ans[++cnt]={nw,m};
        }
		return;
	}
	long double dis=V*V-v*v;
    // cout<<"d="<<d<<" dis="<<dis<<" ";
	dis/=2*a;
    double eps=1e-10;
    // cout<<"d="<<d<<" dis="<<dis<<" ";
    if(a<0&&dis<eps) return;
    if(a>0&&dis<eps) dis=0;
	// if(dis<0) return;
	// double to=d+dis;
	dis+=d;

    // cout<<dis<<"\n";
	if(a>0)
	{
		int nw=0;
		for(int k=18;k>=0;k--)
		{
			int to=nw+(1<<k);
			if(to>m) continue;
			if(p[to]<=dis+eps) nw=to;
		}
		nw++;
		if(nw>m||p[nw]<=dis+eps) return;
		ans[++cnt]={nw,m};
		// to=ceil(to);
		// if(to>)
		// int to=query()
		// ans[++cnt]={}
	}
	if(a<0)
	{
		int nw=0;
		for(int k=18;k>=0;k--)
		{
			int to=nw+(1<<k);
			if(to>m) continue;
			if(p[to]<dis) nw=to;
		}
		// if(nw==0) return;

        int nw1=0;
		for(int k=18;k>=0;k--)
		{
			int to=nw1+(1<<k);
			if(to>m) continue;
			if(p[to]<d) nw1=to;
		}
        nw1++;
        if(nw1>nw) return;
        ans[++cnt]={nw1,nw};
	}
    // cerr<<"nalbag;l'a";
}

bool cmp(Ans x,Ans y)
{
    return x.r<y.r;
}

void solve()
{
    cnt=0;

	n=read();
	m=read();
	L=read();
	V=read();
	for(int i=1;i<=n;i++)
	{
		int d=read(),v=read(),aa=read();
        // cout<<d<<" "<<v<<" "<<aa<<" \n";
		a[i]={d,v,aa};
	}
	// return;
	for(int i=1;i<=m;i++)
    {
        p[i]=read();
        // cerr<<"i="<<i<<" p[i]="<<p[i]<<"\n";
    }
        sort(p+1,p+1+m);
	for(int i=1;i<=n;i++)
    {
        int nw=cnt;
        solve(a[i]);
        // if(nw!=cnt) cout<<"i="<<i<<" "<<"["<<ans[cnt].l<<","<<ans[cnt].r<<"]\n";
    }
    cout<<cnt<<" ";
    sort(ans+1,ans+1+cnt,cmp);

    int nw=0,r=0;
    for(int i=1;i<=cnt;i++)
    {
        // cout<<ans[i].l<<" "<<ans[i].r<<"\n";
        if(r>=ans[i].l) continue;
        nw++;
        r=ans[i].r;
    }
    cout<<m-nw<<"\n";

    // for(int i=1;i<=cnt;i++)

}

signed main()
{
	#ifndef ONLINE_JUDGE
	freopen("a.in","r",stdin);
	freopen("a.out","w",stdout);
	#endif

	int T=read();
	while(T--) solve();

	//mt19937_64 myrand(time(0));
	return 0;
}

2025/8/2 10:32
加载中...