zoukankan      html  css  js  c++  java
  • 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
    ",ans%mod);
        return 0;
    }
  • 相关阅读:
    在线文件转换工具
    中鸣机器人官网
    下载tortoisegit
    知晓云,不用申请服务器即可完成小程序后台开发和部署
    全网音乐免费下载工具
    MySQL5.7 主从复制配置
    Nginx-------Nginx的安装和多域名配置
    如何获取域名(网址)对应的IP地址
    LOGO免费在线设计
    Jmeter-----保存到响应文件
  • 原文地址:https://www.cnblogs.com/ziliuziliu/p/5540673.html
Copyright © 2011-2022 走看看