50分求调边界条件
查看原帖
50分求调边界条件
1132005
Contingency_Core楼主2024/10/27 16:19

样例3,4只有问题1错,5都有错。

每个错的都只差个位数。

我怀疑是car.in()car.in()的问题,考场+考完加起来块盯了4h了都没找出问题QAQ

#include <bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int len,max_v,n;
struct xx
{
    char op;
    int x,id;
    void add(const int x,const int i)
    {
        xx::x=x;
        id=i;
        op=1;
    }
    void sub(const int x,const int i)
    {
        xx::x=x;
        id=i;
        op=0;
    }
    void check(const int x)
    {
        xx::x=x;
        op=2;
    }
}
b[N*3];
int all_b;
struct car
{
    int d,v,a;
    int l,r;
    void in(const int i)
    {
        cin>>d>>v>>a;
        if(a==0)
        {
            if(v>max_v) l=d,r=len;
            else l=r=-1;
        }
        else if(a>0)
        {
            if(v>max_v) l=d,r=len;
            else if(v*v+2ll*a*(len-d)<=max_v*max_v) l=r=-1;
            else l=d+(max_v*max_v-v*v+2*a-1)/(2*a),r=len;
        }
        else
        {
            if(v<=max_v) l=r=-1;
            else if(v*v+2ll*a*(len-d)>max_v*max_v) l=d,r=len;
            else l=d,r=d+(max_v*max_v-v*v)/(2*a);
        }
        if(l>0)
        {
            b[++all_b].add(l,i);
            b[++all_b].sub(r+1,i);
        }
    }
}
a[N];
set<int> all,call;
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr),cout.tie(nullptr);
    //freopen("test.in","r",stdin);
    //freopen("test.out","w",stdout);
    int T,m,p,ans1,ans2;
    bool cb;
    cin>>T;
    while(T--)
    {
        all_b=0,all.clear(),call.clear();
        cin>>n>>m>>len>>max_v;
        for(int i=1;i<=n;i++) a[i].in(i);
        while(m--) cin>>p,b[++all_b].check(p);
        sort(b+1,b+all_b+1,[&](const xx &a,const xx &b){return a.x==b.x?a.op<b.op:a.x<b.x;});
        ans1=ans2=cb=0;
        for(int i=1;i<=all_b;i++)
        {
            switch (b[i].op)
            {
                case 0:
                    all.erase(b[i].id);
                    if(call.find(b[i].id)!=call.end()) cb=0;
                    break;
                case 1:
                    all.insert(b[i].id);
                    break;
                case 2:
                    ans1+=all.size();
                    if(cb)
                    {
                        call.insert(all.begin(),all.end());
                        all.clear();
                        ans2++;
                    }
                    else
                    {
                        if(all.empty()) ans2++;
                        else cb=1,call=all,all.clear();
                    }
                    break;
            }
        }
        cout<<ans1<<' '<<ans2<<'\n';
    }
}
2024/10/27 16:19
加载中...