Colorful Segments 提问
查看原帖
Colorful Segments 提问
655351
evening_maple楼主2024/4/27 22:26

题目链接 https://www.luogu.com.cn/problem/P9561?contestId=126525

想问问为什么以下做法是错误的

大体思路是对线段离散化后求第i段线段为红色对答案的贡献数,其中dp是不同颜色的前缀和数组

ll n, m, h, x, y, z, a, b, c, d, e, u, v, w, i, j, k, l, r, nn, mm, ans, p, q, len, T, he;
ll wcnm = 1, id = 0;
 
struct node {
    ll l, r, c;
}A[N];
 
bool cmp(node a, node b) {
    return a.r < b.r;
}
map<ll, ll>B;
ll dp[N][3];
 
int main() {
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
 
    for (cin >> T; T; --T) {
        cin >> n;
        B.clear();
        for (i = 1; i <= n; ++i) {
            cin >> a >> b >> c;
            A[i] = { a,b,2 - c };
            B[a - 1] = B[a] = B[b] = B[b + 1] = 0;
        }
 
        len = 0;
        for (auto& x : B)x.second = ++len;
 
        for (i = 1; i <= n; ++i)A[i].l = B[A[i].l], A[i].r = B[A[i].r];
        sort(A + 1, A + n + 1, cmp);
 
        dp[1][0] = 1;
        j = 1;
 
        for (i = 2; i <= len; ++i) {
            dp[i][0] = dp[i - 1][0];
            dp[i][1] = dp[i - 1][1];
            dp[i][2] = dp[i - 1][2];
 
            while (j <= n && i == A[j].r) {
                l = A[j].l, r = A[j].r, c = A[j].c;
                d = dp[l - 1][0] + dp[i][c] - dp[l - 1][c];
                dp[i][c] += d;
                dp[i][0] += d;
                ++j;
            }
        }
 
        cout << dp[len][0] << endl;
    }
}
2024/4/27 22:26
加载中...