社区讨论

求助 TLE on #6

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

讨论操作

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

当前回复
3 条
当前快照
1 份
快照标识符
@m2r2al6y
此快照首次捕获于
2024/10/27 12:00
去年
此快照最后确认于
2025/11/04 15:55
4 个月前
查看原帖
CPP
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
int t,n,m,l,lim;
int d[100010],v[100010],a[100010],p[100010];
const double eps=1e-6;
struct seg{
    int l,r;
}b[100010];
bool cmp(const seg &x,const seg &y){
    return x.r<y.r;
}
inline int fl(double x)
{
    if(x-(int)x<eps)return (int)x-1;
    else return (int)x;
}
inline int ce(double x)
{
    if((int)x+1-x<eps)return (int)x+2;
    else return (int)x+1;
}
int main()
{
    //freopen("detect.in","r",stdin);
    //freopen("detect.out","w",stdout);
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d%d%d",&n,&m,&l,&lim);
        for(int i=1;i<=n;i++)
            scanf("%d%d%d",&d[i],&v[i],&a[i]);
        for(int i=1;i<=m;i++)scanf("%d",&p[i]);
        for(int i=1;i<=n;i++)
        {
            if(a[i]>0)
            {
                if(v[i]>lim)
                {
                    b[i].l=d[i];
                    b[i].r=l;
                }
                else
                {
                    double tt=(lim-v[i])*1.0/a[i];
                    b[i].l=min(l+1,ce(d[i]+v[i]*tt+0.5*a[i]*tt*tt));
                    b[i].r=l;
                    //zuo kai you bi
                }
            }
            else if(a[i]==0)
            {
                if(v[i]>lim)
                {
                    b[i].l=d[i];
                    b[i].r=l;
                }
                else
                {
                    b[i].l=1;
                    b[i].r=0;
                }
            }
            else if(v[i]>lim)
            {
                double tt=(lim-v[i])*1.0/a[i];
                b[i].l=d[i];
                b[i].r=min(l,fl(d[i]+v[i]*tt+0.5*a[i]*tt*tt));
                //zuo bi you kai
            }
            else
            {
                b[i].l=1;
                b[i].r=0;
            }
        }
        //cout<<n-ccc<<endl;
        sort(b+1,b+n+1,cmp);
        int now=0,cnt=0,ans=0;
        p[0]=-1;
        for(int i=1;i<=n;i++)
        {
            if(p[now]>=b[i].l)
            {
                //cout<<i<<" "<<p[now]<<endl;
                cnt++;
                continue;
            }
            int nnow=now;
            while(nnow<m&&p[nnow+1]<=b[i].r)nnow++;
            if(p[nnow]<b[i].l)continue;
            now=nnow,ans++,cnt++;
            //cout<<i<<" "<<p[now]<<endl;
        }
        printf("%d %d\n",cnt,m-ans);
    }
    return 0;
}
主要是最后一个 for 里面用时较多,注释掉它之后就挺快。有没有大佬来帮忙一下qwq

回复

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

正在加载回复...