全部评论 3

  • ?

    #include <bits/stdc++.h>
    #define ll long long
    
    using namespace std;
    
    const int N = 1e5 + 10;
    int n, m, L, V, d[N], v[N], a[N];
    vector<int> p;
    struct Seg
    {
        int l, r;                    // 记录车 i 会被测速仪,检测到超速的区间 [l,r]
    };
    
    bool cmp(Seg a, Seg b){
        return a.r < b.r;
    }
    
    vector<Seg> seg;
    
    // 计算瞬间速度
    ll speed(ll v, ll a, ll s){
        return v * v + 2 * a * s; // 题目已经给出式子
    }
    
    void handler(int d, int v, int a){
        // first 表示进入主干道后第一个碰到的测速仪(下标)
        int first = lower_bound(p.begin(), p.end(), d) - p.begin();
        
        // 进入主干道,没有遇到测速仪,跳过
        if (first >= m) return;
    
        // 匀速,那一开始不超速意味着永远不会超速
        if (a == 0){
            if (v > V) seg.push_back({first, m - 1});    // 如果超速,则加入vector
            return;
        }
    
        int l = first, r = m - 1, ans = -1, mid;
        // 减速,找到「最后一个」检测到超速的测速仪
        if (a < 0)
        {
            while (l <= r)
            {
                mid = l + r >> 1;
                if (speed(v, a, p[mid] - d) > V * V)
                    ans = mid, l = mid + 1;
                else
                    r = mid - 1;
            }
            if (ans != -1)
                seg.push_back({first, ans});
            return;
        }
    
        // 加速,找到「首个」能检测到加速的测速仪
        if (a > 0)
        {
            while (l <= r)
            {
                mid = l + r >> 1;
                if (speed(v, a, p[mid] - d) > V * V)
                    ans = mid, r = mid - 1;
                else
                    l = mid + 1;
            }
            if (ans != -1)
                seg.push_back({ans, m - 1});
        }
    }
    
    void solve()
    {
        p.clear();
        seg.clear();
    
        cin >> n >> m >> L >> V;
        for (int i = 1; i <= n; i++)
            cin >> d[i] >> v[i] >> a[i];
        for (int i = 1, x; i <= m; i++)
            cin >> x, p.push_back(x);
    
        for (int i = 1; i <= n; i++) // 处理每辆车的测速仪超速的区间
            handler(d[i], v[i], a[i]);
    
        // 区间覆盖问题
        sort(seg.begin(), seg.end(), cmp);
        int last = -1, ans = 0;
        for (auto it : seg)
            if (last < p[it.l])
                last = p[it.r], ans++;
        cout << (int)seg.size() << " " << m - ans << "\n";
    }
    
    int main()
    {
        ios::sync_with_st
    

    1周前 来自 上海

    0
  • 但全是 int 真的可以吗

    1周前 来自 广东

    0
  • 好写兄弟好写

    1周前 来自 广东

    0

热门讨论