建立ST表,每层维护一个并查集。

每个信息可以拆成两条长度为$2$的幂次的区间相等的信息,等价于ST表里两对点的合并。

然后递归合并,一旦发现已经合并过了就退出。

因为一共只会发生$O(n\log n)$次合并,所以时间复杂度为$O(n\log n\alpha(n))$。

#include<cstdio>
int n,m,i,j,a,b,c,d,f[17][100010],v[100010],ans=9;
int F(int i,int j){return f[i][j]==j?j:f[i][j]=F(i,f[i][j]);}
void merge(int p,int x,int y){
if(F(p,x)==F(p,y))return;
f[p][f[p][x]]=f[p][y];
if(!p)return;
p--;
merge(p,x,y),merge(p,x+(1<<p),y+(1<<p));
}
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
int main(){
read(n),read(m);
if(n==1)return puts("10"),0;
for(i=0;(1<<i)<=n;i++)for(j=1;j+(1<<i)-1<=n;j++)f[i][j]=j;
while(m--){
read(a),read(b),read(c),read(d);i=31-__builtin_clz(b-a+1);
merge(i,a,c),merge(i,b-(1<<i)+1,d-(1<<i)+1);
}
for(v[F(0,1)]=1,i=2;i<=n;i++)if(!v[F(0,i)])v[f[0][i]]=1,ans=10LL*ans%1000000007;
return printf("%d",ans),0;
}

  

最新文章

  1. Pooled Allocation(池式分配)实例——Keil 内存管理
  2. [刘阳Java]_Java技术有哪些学习重点_第1讲
  3. HDU 3333 树状数组离线查询
  4. error和exception的区别,RuntimeException和非RuntimeException的区别
  5. linux 打补丁
  6. Asp.net管道 (第二篇)
  7. 登陆整合实现-QQ互联认证(ASP.NET版本)
  8. hdu4712 Hamming Distance
  9. nodejs、gulp调试工具node-inspector使用
  10. C语言库函数大全及应用实例三
  11. 【前端】Util.js-ES6实现的常用100多个javaScript简短函数封装合集(持续更新中)
  12. Python之print(args)与sys.stdout.write(string)使用总结
  13. 461.汉明距离(c++实现)
  14. linux udev学习
  15. ros 运行rviz时出现 QXcbConnection: XCB error: 148 错误 解决方法
  16. JSP之静态include指令、动态Include指令
  17. 『cs231n』线性分类器损失函数
  18. sql中的duplicate的使用
  19. 使用es6总结笔记
  20. Android Studio2.3相关文章

热门文章

  1. NYOJ题目112指数运算
  2. Java Web基础——Action+Service +Dao三层的功能划分
  3. jQuery &ndash; 3.JQuery的Dom操作
  4. MongoDB的介绍和使用场景(1)
  5. 动态生成SQL执行语句
  6. SQL索引及视图常用语法
  7. Go1.7改善了编译速度并且会生成更快的代码
  8. html5 简单音乐播放器
  9. 在Salesforce中对某一个Object添加自定义的Button和Link
  10. WEB前端知识体系脑图