警示后人,如果你70pts
查看原帖
警示后人,如果你70pts
644963
ln001楼主2024/7/10 15:28

在拆解序列为两部分来更新的时候,应先处理前半部分,再获取后半部分的父亲然后进行处理。

具体可以看下面两段代码:

70pts:

signed main()
{
    csf;
    cin >> n >> m;
    ml = ceil(log2(n));
    pow2[0] = 1;
    f(i, 1, ml) 
    {
        pow2[i] = pow2[i - 1] * 2;
    }
    f(i, 1, n)
    {
        f(j, 0, ml)
        {
            if (i + pow2[j] - 1 > n)
                break;
            fa[i][j] = i;
        }
    }
    while (m--)
    {
        ll l1, r1, l2, r2;
        cin >> l1 >> r1 >> l2 >> r2;
        ll len = log2(r1 - l1 + 1); // delete->ceil()
        ll lm1 = fifa(l1, len), lm2 = fifa(l2, len);
        
        ll mr1 = fifa(r1 - pow2[len] + 1, len), mr2 = fifa(r2 - pow2[len] + 1, len);
fa[lm1][len] = lm2; // move up from line 76 ?
        fa[mr1][len] = mr2;
    }
    for (ll j = ml; j >= 1; j--)
    {
        ll len = pow2[j];
        f(i, 1, n)
        {
            if (i + pow2[j] - 1 > n)
                continue;
            if (fa[i][j] == i)
                continue;
            ll l1 = i, r1 = l1 + len - 1;
            ll l2 = fifa(i, j), r2 = l2 + len - 1;
            ll lm1 = fifa(l1, j - 1), lm2 = fifa(l2, j - 1);
            
            ll mr1 = fifa(r1 - pow2[j - 1] + 1, j - 1), mr2 = fifa(r2 - pow2[j - 1] + 1, j - 1);
fa[lm1][j - 1] = lm2; // move up from line 93 ?
            fa[mr1][j - 1] = mr2;
        }
    }
    ll cnt = 0, ans = 9;
    f(i, 1, n)
    {
        if (fa[i][0] == i)
            cnt++;
    }
    ans = ans * get_pow((cnt - 1) % (P - 1)) % P; // add->get_pow
    cout << ans << endl;
    return 0;
}

100pts:

signed main()
{
    csf;
    cin >> n >> m;
    ml = ceil(log2(n));
    pow2[0] = 1;
    f(i, 1, ml) 
    {
        pow2[i] = pow2[i - 1] * 2;
    }
    f(i, 1, n)
    {
        f(j, 0, ml)
        {
            if (i + pow2[j] - 1 > n)
                break;
            fa[i][j] = i;
        }
    }
    while (m--)
    {
        ll l1, r1, l2, r2;
        cin >> l1 >> r1 >> l2 >> r2;
        ll len = log2(r1 - l1 + 1); // delete->ceil()
        ll lm1 = fifa(l1, len), lm2 = fifa(l2, len);
        fa[lm1][len] = lm2; // move up from line 76->mr1与mr2可能会被影响
        ll mr1 = fifa(r1 - pow2[len] + 1, len), mr2 = fifa(r2 - pow2[len] + 1, len);

        fa[mr1][len] = mr2;
    }
    for (ll j = ml; j >= 1; j--)
    {
        ll len = pow2[j];
        f(i, 1, n)
        {
            if (i + pow2[j] - 1 > n)
                continue;
            if (fa[i][j] == i)
                continue;
            ll l1 = i, r1 = l1 + len - 1;
            ll l2 = fifa(i, j), r2 = l2 + len - 1;
            ll lm1 = fifa(l1, j - 1), lm2 = fifa(l2, j - 1);
            fa[lm1][j - 1] = lm2; // move up from line 93 同L74
            ll mr1 = fifa(r1 - pow2[j - 1] + 1, j - 1), mr2 = fifa(r2 - pow2[j - 1] + 1, j - 1);

            fa[mr1][j - 1] = mr2;
        }
    }
    ll cnt = 0, ans = 9;
    f(i, 1, n)
    {
        if (fa[i][0] == i)
            cnt++;
    }
    ans = ans * get_pow((cnt - 1) % (P - 1)) % P; // add->get_pow
    cout << ans << endl;
    return 0;
}
2024/7/10 15:28
加载中...