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;
    }
  • 相关阅读:
    php中global和$GLOBALS[]的分析之一
    javascript 标签 src 链接动态文件。
    Allegro基本操作——PCB布线
    AMD单桥主板上电时序的详细解释
    AMD单双桥时序简叙
    AMD移动FP5平台时序解释
    orcad元件属性批量修改(通过excel表格)
    加减乘除基本函数
    1.excel如何让一列的数都乘以固定值
    ORCAD元件属性白色区域和黄色区域的理解
  • 原文地址:https://www.cnblogs.com/ziliuziliu/p/5540673.html
Copyright © 2011-2022 走看看