首页 > 其他分享 >洛谷-3295

洛谷-3295

时间:2022-11-08 18:46:59浏览次数:66  
标签:洛谷 r1 int fa l2 l1 3295

洛谷-3295

题意

此题为中文题面。

思路

这里

辅助解释

image

Code

#include <bits/stdc++.h>
using namespace std;
#define _u_u_ ios::sync_with_stdio(false), cin.tie(nullptr)
#define cf int _o_o_;cin>>_o_o_;for (int Case = 1; Case <= _o_o_;Case++)
#define SZ(x) (int)(x.size())
inline void _A_A_();
signed main() {_A_A_();return 0;}

using ll = long long;
// #define int long long
int mod = 1e9 + 7;
const int maxn = 2e5 + 10;
const int N = 210, M = 5010;
const int inf = 0x3f3f3f3f;

int fa[maxn][20];   // 20个fa数组,20个并查集
int LOG2[maxn];

int find (int x,int k) {    // 在第k层查找x的集合序号
    if (x == fa[x][k]) return x;
    return fa[x][k] = find(fa[x][k], k);    // 路径压缩
}

inline void _A_A_() {
    #ifdef LOCAL
    freopen("in.in", "r", stdin);
    #endif
    _u_u_;
    LOG2[0] = -1;
    int n, m;
    cin >> n >> m;
    for (int i = 1;i <= n;i++) {
        LOG2[i] = LOG2[i >> 1] + 1;
    }
    for (int i = 1;i <= n;i++) {
        for (int k = 0;k <= LOG2[n];k++) {
            fa[i][k] = i;   // 对每一层的i初始化为i
        }
    }
    for (int xxxx = 0; xxxx < m;xxxx++) {
        int l1,r1,l2,r2;
        cin >> l1 >> r1 >> l2 >> r2;    // 一次大操作
        int k = LOG2[r1 - l1 + 1];
        int fa_l1 = find(l1, k);
        int fa_l2 = find(l2, k);
        fa[fa_l1][k] = fa_l2;   // 在第k层的第一个小操作
        int fa_r1 = find(r1 - (1 << k) + 1, k);
        int fa_r2 = find(r2 - (1 << k) + 1, k);
        fa[fa_r1][k] = fa_r2;  // 在第k层的第二次小操作
    }
    for (int k = LOG2[n];k >= 1;k--) {  // 将操作从高层向低层转移
        for (int i = 1;i <= n;i++) {
            int fa_i = find(i,k);
            if (fa_i == i) continue;
            int fa_d_l = find(i, k - 1);
            int fa_d_r = find(fa_i, k - 1);
            fa[fa_d_l][k - 1] = fa_d_r;
            fa_d_l = find(i + (1 << (k - 1)), k - 1);
            fa_d_r = find(fa_i + (1 << (k - 1)), k - 1);
            fa[fa_d_l][k - 1] = fa_d_r;
        }
    }
    ll ans = 1;
    for (int i = 1;i <= n;i++) {    // 在第0层得到答案
        if(fa[i][0] == i) ans = (ans == 1 ? 9 : ans * 10 % mod);
    }
    cout << ans << "\n";
}

标签:洛谷,r1,int,fa,l2,l1,3295
From: https://www.cnblogs.com/FanWQ/p/16870774.html

相关文章

  • 洛谷-P2491 消防
    消防树上直径+尺取考虑答案的路径一定是在树上直径,因为离树上任意一个点最远的点一定是直径的两个点其中之一因此先\(dfs\)一下找出直径两个端点从其中一个端点出......
  • 洛谷--【P1618】三连击升级版题解 排列枚举+循环枚举+stl
    题目描述将 1,2,…,91,2,…,9 共 99 个数分成三组,分别组成三个三位数,且使这三个三位数的比例是 A:B:C,试求出所有满足条件的三个三位数,若无解,输出 No!!!。输入格式......
  • 洛谷 P3287
    不难发现一定是拔高一段后缀。所以设\(f_{i,j}\)表示考虑前\(i\)个位置,拔高\(j\)次,第\(i\)个位置强制选的LIS的长度。则有\(f_{i,j}=\max\limits_{1\lex\lt......
  • 洛谷 P3951 [NOIP2017 提高组] 小凯的疑惑 题解
    LuoguP3951[NOIP2017提高组]小凯的疑惑题解注:设\(A,B\)是两个集合,则\(A\timesB\)表示\(A\)与\(B\)的笛卡儿积(直积)。笛卡儿积的定义为\(S\timesM:=\{(s......
  • 洛谷 P2606 [ZJOI2010]排列计数 题解
    LuoguP2606[ZJOI2010]排列计数题解题目描述称一个\(1\simn\)的排列\(p_1,p_2,\dots,p_n\)是Magic的,当且仅当\[\foralli\in[2,n],p_i>p_{\lfloori/2......
  • 【题解】洛谷P2725 [USACO3.1]邮票 Stamps
    从n种邮票中选出不超过k张邮票,使选出来的邮票可以表示1~m之间(含)的所有数。每张邮票在不超过k的前提下,都可以使用无数次,因此可以将问题看成一个完全背包问题。n种邮票就是n......
  • 洛谷P8757 [蓝桥杯 2021 省 A2] 完美序列 题解
    思路为使描述方便,先令题目描述中的“完美序列”反转(即序列单调递增且每一个数都是上一个数的倍数)。原“完美序列”与反转后的本质相同。先考虑最大长度。显然,当完美序列......
  • 洛谷P8775 [蓝桥杯 2022 省 A] 青蛙过河 题解 贪心+二分答案
    题目链接​​https://www.luogu.com.cn/problem/P8775​​题目大意小青蛙住在一条河边,它想到河对岸的学校去学习。小青蛙打算经过河里的石头跳到对岸。河里的石头排成了一条......
  • 洛谷-P8814 题解
    前言蒟蒻感叹!许多大佬的思路真的很复杂,于是为了部分没学过的人写了这篇题解(其实就是为了咕值),值得一看!正文♦算法:式子推导从题中可得\(\begin{cases}n_i=p_i\times......
  • 【题解】洛谷P2946 [USACO09MAR]Cow Frisbee Team S
    这题乍一看是一个朴素的01背包问题,将所有方案的集合按照能力值的和来划分成1~m,然后把m当作体积,把n当作物品数,做一个01背包的代码。于是我兴冲冲地写了代码交上去,然后十组样......