求助啊。。。。
查看原帖
求助啊。。。。
231022
1234567890regis楼主2023/11/28 12:59

十年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。。。不知道为啥。

感谢!!!

2023/11/28 12:59
加载中...