$bzoj4569$
$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 ;
}
随机推荐
- APP公布到应用市场(苹果APP STORE+安卓各大应用市场)
注意事项 1.应用要签名,为了以后可以顺利更新应用.要保持每次的签名一致,所以要妥善保管好签名数据. 2.进行公布測试,最好有个检查表,每次公布的时候进行核查. 苹果APP STORE 一.证书的导出 ...
- Flex4_Tree组件1(添加、删除、展开、关闭、右键菜单)
1.屏蔽系统菜单:工程目录“html-template”文件夹-->“index.template.html”文件中,在var params = {};语句下添加新语句: para ...
- C#编译器选项(目标平台)
用vs编译C#项目的设置中,“属性-生成-目标平台”有anycpu,x86,x64等选项. anycpu(默认值)将编译程序集为使其在任意平台上都可以运行. 在任何可能的时候,应用程序作为 64 位进 ...
- Linux基础(4)-硬盘分区、格式化及文件系统的管理、软件包的管理、yum管理RPM包和python的源码安装
一: 1) 开启Linux系统前添加一块大小为15G的SCSI硬盘 2) 开启系统,右击桌面,打开终端 3) 为新加的硬盘分区,一个主分区大小为5G,剩余空间给扩展分区,在扩展分区上划分1个逻辑 ...
- HDU 4923 Room and Moor(推理+栈维护)
HDU 4924 Room and Moor 题目链接 题意:给定一个01组成的a序列.要求一个b序列,b序列每一个数值为[0, 1]之间的数,而且b序列为非递减序列,要求∑(ai−bi)2最小,求这 ...
- Canvas学习笔记——动画中的三角学
示例1,跟随鼠标的键头: 需要掌握一个重要的公式,这个方法返回从 x 轴到点 (x,y) 之间的角度 Math.atan2(dy,dx); 关键代码: function Arrow() { thi ...
- byte数组和文件的相互转换
/** * 获得指定文件的byte数组 */ private byte[] getBytes(String filePath){ byte[] buffer = null; try { File fi ...
- centos6.4中文输入法安装和切换(转载)
1.用root登录,或者切换到root账户(su root): 2.yum install "@Chinese Support"; 3.exit: 4.System→prefere ...
- Mvc之Ajax上传图片
MyAjaxForm下载地址,点击此处下载 视图部分: @{ ViewBag.Title = "Index"; Layout = "~/Views/Shared/_Lay ...
- 基于struts2的学生报道管理系统(附github源码地址)
本项目参考了<java web轻量级开发全体验>,加入了对mysql的支持. 一.基本业务功能 通过struts2框架,结合mysql数据库构建一个学生报到管理系统,来模拟学生报到登记的过 ...