在拆解序列为两部分来更新的时候,应先处理前半部分,再获取后半部分的父亲然后进行处理。
具体可以看下面两段代码:
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;
}