$st表+并查集$

$考虑暴力方法:我们每次将对应相等的位置用并查集连起来,那么最终答案就是9*10^{连通块个数-1}$

$很明显上面这个办法过不去,问题在于重复次数太多了,如果一个区间已经对应相等了就不用再次连,用st表优化这个过程$

$每次向st表一样递归连接,分成log层,每层维护\frac{n}{logn}个并查集,代表区间,那么我们加入记忆化的思想,如果对应区间已经联通就返回,这个就是用并查集完成,否则继续递归进行这个过程。其实这里就是运用了记忆化的思想$

$那么很明显每层穿起来所有区间需要区间个数-1次,那么一共有nlogn个区间,复杂度也就是nlogn了$

$所以看见这种题就要考虑用一些方式记忆化从而降低复杂度$

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + , P = 1e9 + ;
int n, m;
int fa[][N], Log[N];
int find(int p, int x) {
return x == fa[p][x] ? x : fa[p][x] = find(p, fa[p][x]);
}
void merge(int k, int a, int b) {
int x = find(k, a), y = find(k, b);
if(x == y) {
return;
}
fa[k][x] = y;
if(!k) {
return;
}
merge(k - , a, b);
merge(k - , a + ( << k - ), b + ( << k - ));
}
int main() {
scanf("%d%d", &n, &m);
if(n == ) {
puts("");
return ;
}
for(int j = ; j <= ; ++j) {
for(int i = ; i + ( << j) - <= n; ++i) {
fa[j][i] = i;
}
}
for(int i = ; i <= n; ++i) {
Log[i] = Log[i >> ] + ;
}
while(m--) {
int a, b, c, d;
scanf("%d%d%d%d", &a, &b, &c, &d);
int t = Log[b - a + ];
merge(t, a, c);
merge(t, b - ( << t) + , d - ( << t) + );
}
long long ans = , f = ;
for(int i = ; i <= n; ++i) {
if(find(, i) == i) {
if(f) {
ans = ans * % P;
} else {
f = ;
}
}
}
printf("%lld\n", ans);
return ;
}

随机推荐

  1. xpages很不错的demo

    之前有上传了xpages的样例,如今统一把地址发出来,希望对学习xpages的朋友有帮助 1)这是主要的教程,在没有扩展库之前的教程,假设能熟练使用这个样例已经够了,加上你有html,js,css的功 ...

  2. Odoo configuration items

    [options] addons_path = /opt/odoo/server/openerp/addons,/opt/odoo/server/addons admin_passwd = admin ...

  3. ActiveX控件打包成Cab置于网页中自动下载安装

    [背景] http://www.360doc.com/content/13/1120/20/10159093_330853247.shtml 做过ActiveX控件的朋友都知道,要想把自己做的Acti ...

  4. 专訪阿里陶辉:大规模分布式系统、高性能server设计经验分享

    http://www.csdn.net/article/2014-06-27/2820432 摘要:先后就职于在国内知名的互联网公司,眼下在阿里云弹性计算部门做架构设计与核心模块代码的编写,主要负责云 ...

  5. java web 站点头像上传处理 (springmvc +bootstrap+cropper)

    制作头像上传.请依据您的实际需求.改动代码,不全然正确.仅供參考! 前端页面设计使用bootstrap ,头像预览和剪裁工具使用cropper 后台使用springmvc. 如今来看前端的页面设计 前 ...

  6. fuser - identify processes using files or sockets

    FUSER(1) User Commands FUSER(1) NAME fuser - identify processes using files or sockets SYNOPSIS fuse ...

  7. caffe2--Install

    Install Welcome to Caffe2! Get started with deep learning today by following the step by step guide ...

  8. Oracle中Hint深入理解

    Hint概述 基于代价的优化器是很聪明的,在绝大多数情况下它会选择正确的优化器,减轻了DBA的负担.但有时它也聪明反被聪明误,选择了很差的执行计划,使某个语句的执行变得奇慢无比. 此时就需要DBA进行 ...

  9. ThreadPoolTaskExecutor

    我们在开发过程中经常要用到线程池,线程池应该统一管理起来,而不是随用随建.ThreadPoolTaskExecutor——将线程池交给spring管理 1. ThreadPoolTaskExecuto ...

  10. go echo studygolang ___go_build_myT_go__1_.exe

    https://github.com/studygolang/studygolang [stat]; 用户在线数据存到哪里:redis -> 表示存入 redis,这样支持多机部署; onlin ...