社区讨论

0pts玄关求条(能过样例)

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

讨论操作

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

当前回复
4 条
当前快照
1 份
快照标识符
@mhj3t3xw
此快照首次捕获于
2025/11/03 20:16
4 个月前
此快照最后确认于
2025/11/03 20:16
4 个月前
查看原帖
CPP
#include <bits/stdc++.h>

using namespace std;
int d[100005], v[100005], a[100005], p[100005], b[100005], e[100005], bin[100005][3], zh[100005][3];
int main() {
    cin.tie(0);
    cout.tie(0);
    int t;
    cin >> t;
    for (int i = 1; i <= t; i++) {
        int n, m, l, v0, ans = 0, sum = 1;
        cin >> n >> m >> l >> v0;
        for (int j = 1; j <= n; j++) {
            cin >> d[j] >> v[j] >> a[j];
        }
        for (int j = 1; j <= m; j++) cin >> p[j];
        for (int j = 1; j <= n; j++) {
            if (a[j] >= 0 && v[j] > v0 && d[j] <= p[m]) {
                int l = 1, r = m, mid;
                ans++;
                while (l <= r) {
                    mid = (l + r) / 2;
                    if (p[mid] <= d[j]) {
                        l = mid + 1;
                    } else
                        r = mid - 1;
                }  //二分
                b[ans] = l;
                e[ans] = m;
            } else if (a[j] < 0 && v[j] > v0 && d[j] <= p[m]) {
                long double s = (v0 * v0 - v[j] * v[j] + 0.0) / (2 * a[j] + 0.0) + (d[j] + 0.0);
                ans++;
                int l = 1, r = m, mid;
                long double ccc = s - (int(s) + 0.0);
                s -= ccc;
                int s1 = s;
                while (l <= r) {
                    mid = (l + r) / 2;
                    if (p[mid] <= s1)
                        l = mid + 1;
                    else
                        r = mid - 1;
                }
                e[ans] = r;
                l = 1;
                r = m;
                while (l <= r) {
                    mid = (l + r) / 2;
                    if (p[mid] <= d[j])
                        l = mid + 1;
                    else
                        r = mid - 1;
                }
                b[ans] = l;
                if (e[ans] < b[ans]) {
                    b[ans] = 0;
                    e[ans] = 0;
                    ans--;
                }
            } else if (a[j] > 0 && v[j] < v0 && d[j] <= p[m]) {
                ans++;
                long double s = (v0 * v0 - v[j] * v[j] + 0.0) / (2 * a[j] + 0.0) + (d[j] + 0.0);
                long double ccc = s - (int(s) + 0.0);
                s -= ccc;
                int s1 = s;  // cout<<s1<<'\n';
                int l = 1, r = m, mid;
                while (l <= r) {
                    mid = (l + r) / 2;
                    if (p[mid] <= s1)
                        l = mid + 1;
                    else
                        r = mid - 1;
                }
                b[ans] = l;
                e[ans] = m;
                if (e[ans] < b[ans]) {
                    b[ans] = 0;
                    e[ans] = 0;
                    ans--;
                }
            }
        }
        //第一问,cout<<ans;
        if (ans == 0) {
            continue;
        }
        int shu = 1;
        bin[1][1] = b[1];
        bin[1][2] = e[1];
        for (int j = 2; j <= ans; j++) {
            int ll, rr;
            if (shu == 1) {
                int l = max(b[j], bin[1][1]), r = min(e[j], bin[1][2]);
                if (l > r) {
                    sum++;
                    if (l - 1 == r) {
                        bin[1][1] = min(b[j], bin[1][1]);
                        bin[1][2] = max(e[j], bin[1][2]);
                    } else {
                        shu++;
                        bin[shu][1] = b[j];
                        bin[shu][2] = e[j];
                    }
                } else {
                    bin[1][1] = l;
                    bin[1][2] = r;
                }
            } else if (shu > 1) {
                for (int k = 1; k <= shu - 1; k++) {
                    bool ok = 0;
                    for (int f = 1; f <= shu - k; f++) {
                        if (bin[f][1] > bin[f + 1][1]) {
                            swap(bin[f][1], bin[f + 1][1]);
                            swap(bin[f][2], bin[f + 1][2]);
                            ok = 1;
                        }
                    }
                    if (!ok)
                        break;
                }
                int l = 1, r = shu, mid, biaob, biaoe;
                bool panb = 1, pane = 1;
                while (l <= r) {
                    mid = (l + r) / 2;
                    if (bin[mid][1] < b[j])
                        l = mid + 1;
                    else
                        r = mid - 1;
                }
                if (bin[r][2] < b[j])
                    ll = bin[l][1], biaob = l, panb = 0;
                else
                    ll = b[j], biaob = r;
                l = 1;
                r = shu;
                while (l <= r) {
                    mid = (l + r) / 2;
                    if (bin[mid][2] < e[j])
                        l = mid + 1;
                    else
                        r = mid - 1;
                }
                if (bin[l][1] <= e[j])
                    rr = e[j], biaoe = l;
                else
                    rr = bin[r][2], biaoe = r, pane = 0;
                if (ll <= rr) {
                    zh[1][1] = ll;
                    zh[1][2] = bin[biaob][2];
                    int f = 2;
                    if (pane) {
                        for (int k = biaob + 1; k < biaoe; k++) {
                            zh[f][1] = bin[k][1];
                            zh[f][2] = bin[k][2];
                            f++;
                        }
                        zh[f][1] = bin[biaoe][1];
                        zh[f][2] = rr;
                    } else {
                        for (int k = biaob + 1; k < biaoe; k++) {
                            zh[f][1] = bin[k][1];
                            zh[f][2] = bin[k][2];
                            f++;
                        }
                    }
                    shu = f;
                    for (int k = 1; k <= f; k++) {
                        bin[k][1] = zh[k][1];
                        bin[k][2] = zh[k][2];
                    }
                } else {
                    shu++;
                    sum++;
                    bin[shu][1] = b[j];
                    bin[shu][2] = e[j];
                }
            }
        }
        // for(int j=1;j<=ans;j++)cout<<b[j]<<' '<<e[j]<<'\n';
        cout << ans << ' ' << n - sum << '\n';
    }
    return 0;
}

回复

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

正在加载回复...