十年OI一场空,一半WA,一半RE。
我感觉我的代码也没什么问题啊,有哪位巨佬帮我调一调?
#include <iostream>
#define int long long
using namespace std;
const int MAXN = 5e5 + 7;
const int mod = 1e9 + 7;
int bz[MAXN], fa[MAXN][20];
int n, m;
void init()
{
for (int i = 2; i <= n; i++)
bz[i] = bz[i / 2] + 1;
for (int j = 0; j <= bz[n]; j++)
for(int i = 1; i <= n; i++)
fa[i][j] = i;
}
int find(int x, int y)
{
return fa[x][y] == x ? x : fa[x][y] = find(fa[x][y], y);
}
void merge(int x, int y, int t)
{
fa[find(x, t)][t] = find(y, t);
}
signed main()
{
cin >> n >> m;
init();
while (m--)
{
int l1, r1, l2, r2;
cin >> l1 >> r1 >> l2 >> r2;
int k = bz[r1 - l1 + 1];
merge(l1, l2, k);
merge(r1 - (1 << k) + 1, r2 - (1 << k) + 1, k);
}
int j = bz[n];
while (j--)
{
for (int i = 1; i + (1 << j) <= n + 1; i++)
{
int k = find(i, j);
if (k == i) continue;
merge(i, k, j - 1);
merge(i + 1 << (j - 1), k + 1 << (j - 1), j - 1);
}
}
int cnt = 0, ans = 1;
bool t = true;
for (int i = 1; i <= n; i++)
{
if (find(i, 0) == i) cnt++;
}
for (int i = 0; i < cnt; i++)
{
if (t)
{
ans *= 9;
t = false;
}
else ans = ans * 10 % mod;
}
cout << ans << endl;
}
P.S. 我甚至把数组开了 5e5,本来只是1e5的,竟然还是RE。。。不知道为啥。
感谢!!!