[SCOI2016]萌萌哒

题目

原题链接

解说

叫萌萌哒其实恶心得很……

引自https://www.luogu.com.cn/blog/emptyset/solution-p3295

代码

#include<bits/stdc++.h> 
using namespace std;
const int maxn = 100005, mod = 1000000007;
int n, m, fa[maxn][18], ans;
int find(int x, int k) {
	if(fa[x][k]==x) return x;
	return fa[x][k]=find(fa[x][k],k);
}
void merge(int x, int y, int k) {
    x = find(x, k), y = find(y, k);
    if(x != y) fa[x][k] = y;
}
int main() {
    scanf("%d %d", &n, &m);
    const int maxk = floor(log2(n));
    for(int i = 1; i <= n; ++i)
        for(int k = 0; k <= maxk; ++k)
            fa[i][k] = i;           
    for(int i = 1, l1, r1, l2, r2; i <= m; ++i) {
        scanf("%d %d %d %d", &l1, &r1, &l2, &r2);
        for(int k = maxk; ~k; --k)
            if(l1+(1<<k)-1 <= r1) merge(l1, l2, k), l1 += 1<<k, l2 += 1<<k;
    }   
    for(int k = maxk; k; --k){
        for(int i = 1; i+(1<<k)-1 <= n; ++i) {
            int pos = find(i, k);
            merge(i, pos, k-1), merge(i+(1<<k-1), pos+(1<<k-1), k-1);
        }
    }
    for(int i = 1; i <= n; ++i)
        if(fa[i][0] == i) ans = !ans ? 9 : ans * 10ll % mod;
    printf("%d", ans);
    return 0;
}

幸甚至哉,歌以咏志。

posted @ 2020-05-04 18:01  DarthVictor  阅读(106)  评论(0编辑  收藏  举报
莫挨老子!