社区讨论

家人们,蚌埠住了,80分!!?

P11232[CSP-S 2024] 超速检测参与者 1已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@m3a356ke
此快照首次捕获于
2024/11/09 19:31
去年
此快照最后确认于
2025/11/04 15:02
4 个月前
查看原帖
民间数据过了,大样例过了,但是官方数据80
WA#on 5,6;
救救孩子吧,救救孩子吧~~~
CPP
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define il inline
il ll read()
{
	ll x=0,f=1;char c=getchar();
	while(c<'0'||c>'9') {if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+c-'0';c=getchar();}
	return x*f;
}
const ll N=2e6+6;
ll T,n,m,L,V;
ll d[N],a[N],v[N];
ll t[N],bit=1,tv[N];
ll l[N],r[N];
struct h
{
	int l,r;
}f[N];
ll tot,ans;
bool cmp(h a,h b)
{
	if(a.r==b.r) return a.l<b.l;
	return a.r<b.r;
}
int main()
{
	T=read();
	while(T--)
	{
		ans=tot=0;bit=1;
		n=read(),m=read(),L=read(),V=read();
		for(ll i=1;i<=100000;i++) l[i]=r[i]=-1;
		for(ll i=1;i<=n;i++) d[i]=read(),v[i]=read(),a[i]=read();
		for(ll i=1;i<=m;i++) t[i]=read();tv[0]=1;
		for(ll i=1;i<=L;i++) if(i>t[bit]&&bit<=m) tv[i]=tv[i-1]+1,bit++;else tv[i]=tv[i-1];//这个东西是知道坐标后的 O(1)求下个监控的序号
		for(ll i=1;i<=n;i++)
		{
			if(d[i]>t[m]) continue;
			if(a[i]==0) //a==0的情况 
			{
				if(v[i]>V&&d[i]<=t[m]) l[i]=t[tv[d[i]]],r[i]=t[m];
			}
			if(a[i]>0)//a>0的情况
			{
				if(v[i]>V&&d[i]<=t[m]) l[i]=t[tv[d[i]]],r[i]=t[m];
				if(v[i]<V&&d[i]<=t[m])
				{
					double B=(V*V-v[i]*v[i])*1.0/2.0/a[i]*1.0;
					ll s=floor(B+1);
					if(d[i]+s<=t[m]) l[i]=t[tv[d[i]+s]],r[i]=t[m]; 
				}
				if(v[i]==V&&d[i]<=t[m]) l[i]=t[tv[d[i]+1]],r[i]=t[m];
			}
			if(a[i]<0)//a<0的情况
			{
				if(v[i]>V&&d[i]<=t[m])
				{
					
					/**/double B=(V*V-v[i]*v[i])*1.0/2.0/a[i]*1.0;
					ll s=ceil(B-1);
					if(d[i]+s==t[tv[d[i]+s]]) l[i]=t[tv[d[i]]],r[i]=t[tv[d[i]+s]];
					else if(d[i]+s>t[tv[d[i]]])
					{
						if(d[i]+s>=t[m]) l[i]=t[tv[d[i]]],r[i]=t[m];
						if(d[i]+s<t[m]) l[i]=t[tv[d[i]]],r[i]=t[tv[d[i]+s]-1];
					}
				}
			}
		}
		for(ll i=1;i<=n;i++)//贪心求第二问 
		{
			if(l[i]!=-1&&r[i]!=-1)
			{
				tot++;
				f[tot].l=l[i];
				f[tot].r=r[i];
			}
		}
		sort(f+1,f+tot+1,cmp);
		ll bb=-1;
		for(ll i=1;i<=tot;i++)
		{
			if(bb<f[i].l) ans++,bb=f[i].r;
		}
		cout<<tot<<" "<<m-ans<<"\n";
	}
	return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...