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;
}
原文地址:https://www.cnblogs.com/ziliuziliu/p/5540673.html