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;
    }
  • 相关阅读:
    设计模式-装饰器模式
    自定义 RestTemplate 异常处理 (转)
    Jackson 高级应用
    Jackson 的 基本用法
    Jackson转换为Collection、Array
    Jackson中处理map中的null key 或者null value 及实体字段中的null value
    sed
    MySQL server has gone away 异常
    nl命令
    线程池
  • 原文地址:https://www.cnblogs.com/ziliuziliu/p/5540673.html
Copyright © 2011-2022 走看看