社区讨论
求调代码,区间贪心版本
P11232[CSP-S 2024] 超速检测参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @m2zp84v6
- 此快照首次捕获于
- 2024/11/02 13:04 去年
- 此快照最后确认于
- 2025/11/04 15:32 4 个月前
CPP
#include <bits/stdc++.h>
using namespace std;
#define int long long
int read()
{
char c=getchar();
int ans=0,f=1;
while(c<48||c>57)
{
if(c=='-')
{
f=-1;
c=getchar();
}
}
while(c>=48&&c<=57)
{
ans=(ans<<3)+(ans<<1)+c-48;
c=getchar();
}
return f*ans;
}
void write(int x)
{
if(x>=10) write(x/10);
putchar(x%10+48);
}
int n,m,l,v,tot;
struct car
{
int d,v,a;
}a[100005];
int csy[100005];
struct line
{
int start,end;
}w[1000005];
bool cmp(line a,line b)
{
return a.end<b.end;
}
bool cheak(int x)
{
int daa=lower_bound(csy+1,csy+m+1,a[x].d)-csy;
if(a[x].a==0)
{
if(a[x].v>v&&a[x].d<=csy[m])
{
w[++tot].start=daa;
w[tot].end=m;
return false;
}
else return true;
}
double t=a[x].d+(v*1.0*v*1.0-a[x].v*1.0*a[x].v*1.0)/(2.0*a[x].a);
daa=upper_bound(csy+1,csy+m+1,t)-csy;
if(a[x].a>0)
{
if(t>=csy[m]) return true;
else
{
w[++tot].start=daa;
w[tot].end=m;
return false;
}
}
int da=upper_bound(csy+1,csy+m+1,a[x].d)-csy;
if(a[x].a<0)
{
if(t<=csy[da]) return true;
else
{
w[++tot].start=da;
if(csy[daa-1]==t) w[tot].end=daa-2;
else w[tot].end=daa-1;
return false;
}
}
return false;
}
void solve()
{
int ans=0;
n=read(),m=read(),l=read(),v=read();
for(int i=1;i<=n;i++) a[i].d=read(),a[i].v=read(),a[i].a=read();
for(int i=1;i<=m;i++) csy[i]=read();
for(int i=1;i<=n;i++){
if(!cheak(i)) ans++;
}
write(ans);
sort(w+1,w+ans+1,cmp);
int pos=0,ansa=0;
for(int i=1;i<=ans;i++)
{
if(w[i].start>pos)
{
ansa++;
pos=w[i].end;
}
}
cout<<" "<<m-ansa<<endl;
}
signed main()
{
freopen("detect3.in","r",stdin);
int p;
p=read();
while(p--) solve();
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...