BZOJ 4569 萌萌哒

SCOI血泪史。。。。

ST+并查集。

昏昏沉沉的情况下交了过去然而垫底。。6000ms。

反正还是没TLE嘛。

唉。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 200500
#define mod 1000000007
using namespace std;
long long n,m,l1,l2,r1,r2,anc[maxn][20],table[20];
void get_table()
{
    table[0]=1;
    for (long long i=1;i<=20;i++) table[i]=table[i-1]<<1;
    for (long long i=1;i<=n;i++)
        for (long long j=0;j<=20;j++)
            anc[i][j]=i;
}
long long getfather(long long x,long long y)
{
    if (x!=anc[x][y])
        anc[x][y]=getfather(anc[x][y],y);
    return anc[x][y];
}
void unionn()
{
    long long l=r1-l1+1;
    for (long long i=20;i>=0;i--)
    {
        if (l>=table[i])
        {
            long long f1,f2;
            f1=getfather(l1,i);f2=getfather(l2,i);
            if (f1>f2) swap(f1,f2);
            anc[f2][i]=f1;
            f1=getfather(r1-table[i]+1,i);f2=getfather(r2-table[i]+1,i);
            if (f1>f2) swap(f1,f2);
            anc[f2][i]=f1;
        }
    }
}
void pushdown(long long x)
{
    for (long long i=1;i<=n;i++)
    {
        if (i+table[x]>n+1) continue;
        if (getfather(i,x)!=i)
        {
            long long fath=getfather(i,x);
            long long f1,f2;
            f1=getfather(i,x-1);f2=getfather(fath,x-1);
            if (f1>f2) swap(f1,f2);
            anc[f2][x-1]=f1;
            f1=getfather(i+table[x-1],x-1);f2=getfather(fath+table[x-1],x-1);
            if (f1>f2) swap(f1,f2);
            anc[f2][x-1]=f1;
        }
    }
}
int main()
{
    scanf("%lld%lld",&n,&m);
    get_table();
    for (long long i=1;i<=m;i++)
    {
        scanf("%lld%lld%lld%lld",&l1,&r1,&l2,&r2);
        unionn();
    }
    for (long long i=20;i>=1;i--)
        pushdown(i);
    long long ans=1;
    for (long long i=1;i<=n;i++)
    {
        if (getfather(i,0)==i)
        {
            if (i==1) ans=(ans*9)%mod;
            else ans=(ans*10)%mod;
        }
    }
    printf("%lld\n",ans%mod);
    return 0;
}
时间: 2024-10-23 18:19:28

BZOJ 4569 萌萌哒的相关文章

bzoj 4569: [Scoi2016]萌萌哒

4569: [Scoi2016]萌萌哒 Description 一个长度为n的大数,用S1S2S3...Sn表示,其中Si表示数的第i位,S1是数的最高位,告诉你一些限制条件,每个条 件表示为四个数,l1,r1,l2,r2,即两个长度相同的区间,表示子串Sl1Sl1+1Sl1+2...Sr1与Sl2Sl2+1Sl2+2...S r2完全相同.比如n=6时,某限制条件l1=1,r1=3,l2=4,r2=6,那么123123,351351均满足条件,但是12012,13 1141不满足条件,前者数的

BZOJ 4569 [Scoi2016]萌萌哒 ——ST表 并查集

好题. ST表又叫做稀疏表,这里利用了他的性质. 显然每一个条件可以分成n个条件,显然过不了. 然后发现有许多状态是重复的,首先考虑线段树,没什么卵用. 然后ST表,可以每一层表示对应的区间大小的两个部分是否合并,如果合并就不向下递归. 然后可以剪去许多状态,变成了$O(nlogn)$的. #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using n

4569: [Scoi2016]萌萌哒

4569: [Scoi2016]萌萌哒 链接 分析: 每次给出的两个区间长度是一样的,对应位置的数字也是一样的,那么可以将两两对应的数字用并查集合并,设最后有$cnt$个不同的集合,答案就是$9\times 10 ^{cnt-1}$,第一个数不能是0. 暴力合并太慢了,考虑优化.对于一段区间,用倍增的思想分成log段,分别合并log段,最后的下放一下标记即可.类似线段树的懒标记. 代码: #include<cstdio> #include<algorithm> #include&l

【BZOJ-4569】萌萌哒 ST表 + 并查集

4569: [Scoi2016]萌萌哒 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 459  Solved: 209[Submit][Status][Discuss] Description 一个长度为n的大数,用S1S2S3...Sn表示,其中Si表示数的第i位,S1是数的最高位,告诉你一些限制条件,每个条件表示为四个数,l1,r1,l2,r2,即两个长度相同的区间,表示子串Sl1Sl1+1Sl1+2...Sr1与Sl2Sl2+1Sl2+2.

【BZOJ4569】萌萌哒(并查集,倍增)

[BZOJ4569]萌萌哒(并查集,倍增) 题面 BZOJ 题意: 有一个长度为\(n\)的数 给定\(m\)个限制条件 每次限制\(l1-r1\)与\(l2-r2\)是相同的 求出方案数 题解 如果每次给定的限制都是告诉你某一位和某一位是相同的 那么,我们的做法是: 并查集,然后计算有\(k\)个联通块 \(ans=9*10^{k-1}\) 但是,现在每次给定的都是一个区间 我们不太可能暴力的把区间之间的位置两两进行一次合并 所以,我们来想个办法优化一下. 试试倍增? 维护\(logn\)个并

BZOJ 1013: [JSOI2008]球形空间产生器sphere

二次联通门 : BZOJ 1013: [JSOI2008]球形空间产生器sphere /* BZOJ 1013: [JSOI2008]球形空间产生器sphere 高斯消元 QAQ SB的我也能终于能秒题了啊 设球心的坐标为(x,y,z...) 那么就可以列n+1个方程,化化式子高斯消元即可 */ #include <cstdio> #include <iostream> #include <cstring> #define rg register #define Max

bzoj 3309 DZY Loves Math - 莫比乌斯反演 - 线性筛

对于正整数n,定义f(n)为n所含质因子的最大幂指数.例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10007)=1, f(1)=0. 给定正整数a,b,求sigma(sigma(f(gcd(i,j)))) (i=1..a, j=1..b). Input 第一行一个数T,表示询问数. 接下来T行,每行两个数a,b,表示一个询问. Output 对于每一个询问,输出一行一个非负整数作为回答. Sample Input 4 7558588 9653114 6514903 445

【BZOJ】[HNOI2009]有趣的数列

[算法]Catalan数 [题解] 学了卡特兰数就会啦>_<! 因为奇偶各自递增,所以确定了奇偶各自的数字后排列唯一. 那么就是给2n个数分奇偶了,是不是有点像入栈出栈序呢. 将做偶数标为-1,做奇数标为+1,显然当偶数多于奇数时不合法,因为它压不住后面的奇数. 然后其实这种题目,打表就可知啦--QAQ 然后问题就是求1/(n+1)*C(2n,n)%p了,p不一定是素数. 参考bzoj礼物的解法. 看到网上清一色的素数筛+分解质因数解法,不解了好久,感觉写了假的礼物-- 后来觉得礼物的做法才比

洛谷 P2709 BZOJ 3781 小B的询问

题目描述 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重复次数.小B请你帮助他回答询问. 输入输出格式 输入格式: 第一行,三个整数N.M.K. 第二行,N个整数,表示小B的序列. 接下来的M行,每行两个整数L.R. 输出格式: M行,每行一个整数,其中第i行的整数表示第i个询问的答案. 输入输出样例 输入样例#1: 6 4 3 1 3 2 1 1 3