首页 > 其他分享 >SCOI 萌萌哒 题解

SCOI 萌萌哒 题解

时间:2022-10-10 19:55:06浏览次数:73  
标签:int 题解 萌萌 SCOI fa ans include find

下决心写一道题写一篇题解。

题目链接

考虑暴力,直接并查集合并相同的数,和今天T1一样。

考虑优化这个暴力。因为今天T1题解说要倍增,所以考虑一个长的跟ST表一样的倍增。

具体的,我们对每个位置开个长的跟ST表一样的东西。也就是 \(id[i][j]\) 代表 \(i\) 为左端点长度为 \(2^j\) 的情况。然后每次给你一个区间,把区间长度二进制拆分,对应位置合并,这样单次修改就是 \(O(\log n)\) 的。查询的时候直接从大到小扫段长,把长段对半分成两个短段就行了。

最后统计有多少个不一样的记作 \(cnt\) ,答案就是 \(9\times 10^{cnt-1}\) (因为开头不能是 \(0\) )。

看代码吧。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
const int mod=1000000007;
int n,m,num,cnt;
int fa[100010*20],id[100010][20];
bool v[100010];
int find(int x){
    return fa[x]==x?fa[x]:fa[x]=find(fa[x]);
}
void merge(int x,int y){
    x=find(x);y=find(y);fa[y]=x;
}
int qpow(int a,int b){
    int ans=1;
    while(b){
        if(b&1)ans=1ll*ans*a%mod;
        a=1ll*a*a%mod;
        b>>=1;
    }
    return ans;
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=0;i<=__lg(n);i++){
        for(int j=1;j<=n;j++){
            id[j][i]=++num;fa[id[j][i]]=num;//初始化并查集
        }
    }
    for(int i=1;i<=m;i++){
        int l1,r1,l2,r2;
        scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
        int len=r1-l1+1;
        for(int k=__lg(n);k>=0;k--){//从大到小二进制拆分段长
            if(l1+(1<<k)-1<=r1){
                merge(id[l1][k],id[l2][k]);
                l1+=(1<<k);l2+=(1<<k);//合并对应位置
            }
        }
    }
    for(int j=__lg(n);j>=1;j--){
        for(int i=1;i+(1<<j)-1<=n;i++){
            int x=find(id[i][j]);
            if(x==id[i][j])continue;
            x%=n;if(!x)x=n;//找到对应的左端点x
            merge(id[x][j-1],id[i][j-1]);
            merge(id[x+(1<<(j-1))][j-1],id[i+(1<<(j-1))][j-1]);//分成两端合并
        }
    }
    for(int i=1;i<=n;i++){
        int x=find(id[i][0]);
        x%=n;if(!x)x=n;//统计答案
        if(!v[x]){
            v[x]=true;cnt++;
        }
    }
    printf("%lld\n",9ll*qpow(10,cnt-1)%mod);
    return 0;
}

标签:int,题解,萌萌,SCOI,fa,ans,include,find
From: https://www.cnblogs.com/gtm1514/p/16776964.html

相关文章

  • 洛谷 P3488 [POI2009]LYZ-Ice Skates 题解
    错解每次跑二分图匹配,时间复杂度显然爆炸。时间复杂度:我被杀手皇后摸过了正解引入Hall定理:设二分图中\(G=<V_1,V_2,E>,|V_1|\le|V_2|\),则G中存在\(V_1\)到......
  • 【题解】XXI Opencup GP of Tokyo Count Min Ratio
    有\(R\)个红球,\(B\)个蓝球和一个绿球,同色球之间无区别。将其任意排列,令\(l_R,l_B,r_R,r_B\)分别为绿球左/右边的红/蓝球数量。定义一个方案的权值为\(\max\{x\i......
  • Criss Cross OJ【R001】8月月赛I题解合集
    R0011.「T1」积木高塔Solution返回题目简要题意:给定一个矩阵,以及其每一格中完全相同立方体的高度(即个数),求:这座高塔最高点的高度。这座高塔从第\(1\)层到最高......
  • AtCoder Regular Contest 150 (ARC150) - A+B+C+D 题解
    A题意给定一个由0,1和?组成的长为\(n\)序列,其中?需要被替换为0或1,询问是否有且仅有一种?的替换方案使得序列中有\(k\)个1并且这\(k\)个1是连续的序......
  • [题解]守护者的挑战
    题目描述打开了黑魔法师Vani的大门,队员们在迷宫般的路上漫无目的地搜寻着关押applepi的监狱的所在地。突然,眼前一道亮光闪过。“我,Nizem,是黑魔法圣殿的守卫者。如果你能通......
  • Luogu P6880 [JOI 2020 Final] オリンピックバス 题解
    [P6880JOI2020Final]オリンピックバス-洛谷|计算机科学教育新生态(luogu.com.cn)两条前置知识:在图\(G\)上构造根为\(x\)的最短路树\(T\),我们删除任意一条......
  • ARC150 A+C题题解。
    如题,ARC150A题C题的解题报告。#A-Continuous1###题意:有1,0,?组成的一个序列(?可以为0/1),问恰好有且仅有k个i,且连续的情况有多少种。###分析:考虑O(n).常见为转......
  • P6772 [NOI2020] 美食家 题解
    一道不错的题目。一个朴素的dp就是\(f_{i,x}\)表示时间\(i\)时从1走到\(x\)的最大美味值,就有转移\(f_{i,v_j}=\max\{f_{i-w_j,u_j}+c_{v_j}+美食节贡献\}\),结......
  • 校内集训 小朋友的数字 题解
    校内集训小朋友的数字题解目录校内集训小朋友的数字题解题目分析思路代码题目不想调格式了,直接粘截图了……分析这道题就是简简单单的贪心,再加上个前缀和就行......
  • LG5219 无聊的水题I 题解
    传送门题意求有多少节点数为\(n\)的树,使得节点中最大的度数为\(m\)。节点有标号,两棵树不同当且仅当一对节点在一棵树中有连边,另一棵树中没有连边。\(1\len,m\le......