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; }