社区讨论
家人们,蚌埠住了,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 条回复,欢迎继续交流。
正在加载回复...