程序厌氧
查看原帖
程序厌氧
664034
_xxxxx_楼主2024/7/19 14:47

rt,找不到 UB.

#include <iostream>
#include <stack>
#include <cmath>
#include <vector>
#include <map>
#include <string.h>
#include <queue>
#include <iomanip>
#include <cstdio>
#include <algorithm>
#define int long long
using namespace std;
const int N = 1e5 + 10;
const int INF = 0x3f3f3f3f;
const int mod = 1e9 + 7;
int n, m;
int fa[N][30];
int find(int x, int k)
{
	return (fa[x][k] == x ? x : fa[x][k] = find(fa[x][k], k));
}
int merge(int x, int y, int k)
{
	int fx = find(fa[x][k], k);
	int fy = find(fa[y][k], k);
	if(fx != fy) fa[fx][k] = fy;
}
int lg[N];
signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin >> n >> m;
	for(int i = 2; i <= n; i++) lg[i] = lg[i >> 1] + 1;
	for(int i = 1; i <= n; i++)
	{
		for(int j = 0; j <= lg[n]; j++)
		{
			fa[i][j] = i;
		}
	}
	for(int i = 1; i <= m; i++)
	{
		int l1, r1, l2, r2;
		cin >> l1 >> r1 >> l2 >> r2;
		for(int k = lg[n]; ~k; k--)
		{
			if(l1 + (1 << k) - 1 <= r1)
			{
				merge(l1, l2, k);
				l1 += (1 << k);
				l2 += (1 << k);
			}
		}
	}
	for(int k = lg[n]; k; k--)
	{
		for(int i = 1; i + (1 << k) - 1 <= n; i++)
		{
			int fi = find(i, k);
			merge(i, fi, k - 1);
			merge(i + (1 << k - 1), fi + (1 << k - 1), k - 1);
		}
	}
	int ans = 0;
	for(int i = 1; i <= n; i++)
	{
		if(fa[i][0] == i)
		{
			if(!ans) ans = 9;
			else ans = (ans * 10) % mod;
		}
	}
	cout << ans << endl;
	return 0;
}
2024/7/19 14:47
加载中...