看到这题,首先想到\(n^{2}\)的暴力,就是用并查集暴力合并两个相等的点。但由于这样会导致反复地访问同一个操作,显然是不能够的。于是我们可以联想这题的特殊性质,就是互相连变的点都是一段一段的区间。然后很自然地联想到线段树分解优化,坚定地想了一个半小时还多,然后很自然地挂了。天知道我是怎么把一个暴力的复杂度给生生算出 \(nlog^{2}m\) 的复杂度来的……(⊙﹏⊙)

  线段树的区间分割并不是很灵活,而且完全没有改变暴力的本质。于是灰溜溜的去看题解,倍增?恍然大悟一般。是啊,分解区间我们还有倍增呀~我们可以用 \(f[i][j]\) 表示 \(i\) 与向后的 \(2^{j}\) 个点,我们就可以\(O(1))\)地完成区间的合并了。最后,由于如果 \(f[i][j]\) 与 \(f[k][j]\) 是相等的,那么他们下面的所有倍增区间也都是相等的。我们类似 push_down 操作,让儿子继承一下父亲的集合关系即可。受教啦~

#include <bits/stdc++.h>
using namespace std;
#define maxn 100500
#define mod 1000000007
#define LL long long
int n, m, cnt, fa[maxn * ];
int lc[maxn * ], rc[maxn * ];
int bit[], Log[maxn], f[maxn][]; int read()
{
int x = , k = ;
char c; c = getchar();
while(c < '' || c > '') { if(c == '-') k = -; c = getchar(); }
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * k;
} void init()
{
bit[] = ; for(int i = ; i < ; i ++) bit[i] = bit[i - ] << ;
Log[] = -; for(int i = ; i <= n; i ++) Log[i] = Log[i >> ] + ;
for(int j = ; bit[j] <= n; j ++)
for(int i = ; i + bit[j] - <= n; i ++)
{
f[i][j] = ++ cnt;
if(j)
{
lc[cnt] = f[i][j - ];
rc[cnt] = f[i + bit[j - ]][j - ];
}
}
for(int i = ; i <= cnt; i ++) fa[i] = i;
} int find(int x) { return ((fa[x] == x) ? x : fa[x] = find(fa[x])); }
void merge(int x, int y)
{
x = find(x), y = find(y);
if(x != y) fa[x] = y;
} int main()
{
n = read(), m = read();
init();
for(int i = ; i <= m; i ++)
{
int l1 = read(), r1 = read(), l2 = read(), r2 = read();
int k = Log[r1 - l1 + ];
merge(f[l1][k], f[l2][k]);
merge(f[r1 - bit[k] + ][k], f[r2 - bit[k] + ][k]);
}
for(int i = cnt, tem; i > n; i --)
if((tem = find(i)) != i)
{
merge(lc[i], lc[tem]);
merge(rc[i], rc[tem]);
}
int ans = , base = ;
for(int i = ; i <= n; i ++) ans += (find(i) == i);
for(int i = ; i < ans; i ++) base = ((LL) base * 10LL) % mod;
printf("%d\n", base);
return ;
}

【题解】SCOI2006萌萌哒的更多相关文章

  1. ETO的公开赛T4《对抗水滴》 题解(BY 萌萌哒123456 )

    题意: 给你一个\(n*n\)的矩阵A,其中有\(T\)个元素不为零.定义矩阵内元素\((x,y)\)的能量值 \(E[x][y]=\sum_{i=1}^{x}\sum_{j=1}^{y}[A[i][ ...

  2. ETO的公开赛T2《宏聚变》 题解(BY 萌萌哒123456 )

    我们注意到这道题中最多有 $(n+q)$ 个数被加入,而每个数最多被删除一次,因此每次操作 $O(logn)$的复杂度是可以接受的. 我们对于$1..100000$之间每个数分别开一个set,维护这个 ...

  3. 1754: [Usaco2005 qua]Bull Math

    1754: [Usaco2005 qua]Bull Math Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 398  Solved: 242[Submit ...

  4. 2272: [Usaco2011 Feb]Cowlphabet 奶牛文字

    2272: [Usaco2011 Feb]Cowlphabet 奶牛文字 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 138  Solved: 97 ...

  5. 1593: [Usaco2008 Feb]Hotel 旅馆

    1593: [Usaco2008 Feb]Hotel 旅馆 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 391  Solved: 228[Submit ...

  6. 1657: [Usaco2006 Mar]Mooo 奶牛的歌声

    1657: [Usaco2006 Mar]Mooo 奶牛的歌声 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 526  Solved: 365[Submi ...

  7. 1821: [JSOI2010]Group 部落划分 Group

    1821: [JSOI2010]Group 部落划分 Group Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1308  Solved: 627[Su ...

  8. 1022: [SHOI2008]小约翰的游戏John

    1022: [SHOI2008]小约翰的游戏John Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 1322  Solved: 829[Submit][ ...

  9. P3295 萌萌哒 题解

    题目 一个长度为n的大数,用\(S_1,S_2,S_3...S_n\)表示,其中\(S_i\)表示数的第\(i\)位,\(S_1\)是数的最高位,告诉你一些限制条件,每个条 件表示为四个数,\(l_1 ...

随机推荐

  1. GDAL中GDALDataset::RasterIO分块读取的实现

    GDALDataset类中的RasterIO函数能够对图像任意指定区域.任意波段的数据按指定数据类型.指定排列方式读入内存和写入文件中,因此可以实现对大影像的分块读.写运算操作.针对特大的影像图像,有 ...

  2. 2212: [Poi2011]Tree Rotations

    2212: [Poi2011]Tree Rotations https://www.lydsy.com/JudgeOnline/problem.php?id=2212 分析: 线段树合并. 首先对每个 ...

  3. python3 BeautifulSoup模块使用

    BeautifulSoup就是Python的一个HTML或XML的解析库,可以用它来方便地从网页中提取数据.官方解释如下: Beautiful Soup提供一些简单的.Python式的函数来处理导航. ...

  4. selenium自动化测试资源整理

    1. 所有版本chrome下载 是不是很难找到老版本的chrome?博主收集了几个下载chrome老版本的网站,其中哪个下载的是原版的就不得而知了. http://www.slimjet.com/ch ...

  5. 韦大仙--Katalon---一款好用的selenium自动化测试插件

    selenium框架是目前使用较广泛的开源自动化框架,一款好的.基于界面的录制工具对于初学者来说可以快速入门:对于老手来说可以提高开发自动化脚本的效率.我们知道Selenium IDE是一款使用较多的 ...

  6. java字符转义

    之前对java字符转义这一块稍作了解,在这里理理自己主观浅显的理解 这里会谈谈字符编码的是另一种问题和转义没有关系 以下面代码做分析 System.out.println("a". ...

  7. opencv-学习笔记(2)

    opencv-学习笔记(2) 这章记录了 获取像素点,改变像素点 获取图像的属性(行,列,通道数,数据类型) roi感应区 拆分以及合并图像通道 边缘扩充 opencv获取像素点,改变像素点 ---- ...

  8. Ext JS 6学习文档–第2章–核心概念

    核心概念 在下一章我们会构建一个示例项目,而在这之前,你需要学习一些在 Ext JS 中的核心概念,这有助于你更容易理解示例项目.这一章我们将学习以下知识点: 类系统,创建和扩展类 事件 Ext JS ...

  9. Thunder团队第五周 - Scrum会议2

    Scrum会议2 小组名称:Thunder 项目名称:i阅app Scrum Master:胡佑蓉 工作照片: 参会成员: 王航:http://www.cnblogs.com/wangh013/ 李传 ...

  10. maven把项目打包成jar包后找不到velocity模板的bug

    使用springmvc 开发时候要实现发送velcotiy模板邮件,在配置正常后,在本地测试正常后,使用maven打包成jar包后,报以下错误, Caused by: org.apache.veloc ...