博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【题解】SCOI2006萌萌哒
阅读量:5298 次
发布时间:2019-06-14

本文共 2137 字,大约阅读时间需要 7 分钟。

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

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

#include 
using namespace std;#define maxn 100500#define mod 1000000007#define LL long longint n, m, cnt, fa[maxn * 20];int lc[maxn * 20], rc[maxn * 20];int bit[20], Log[maxn], f[maxn][20];int read(){ int x = 0, k = 1; char c; c = getchar(); while(c < '0' || c > '9') { if(c == '-') k = -1; c = getchar(); } while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar(); return x * k;}void init(){ bit[0] = 1; for(int i = 1; i < 20; i ++) bit[i] = bit[i - 1] << 1; Log[0] = -1; for(int i = 1; i <= n; i ++) Log[i] = Log[i >> 1] + 1; for(int j = 0; bit[j] <= n; j ++) for(int i = 1; i + bit[j] - 1 <= n; i ++) { f[i][j] = ++ cnt; if(j) { lc[cnt] = f[i][j - 1]; rc[cnt] = f[i + bit[j - 1]][j - 1]; } } for(int i = 1; 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 = 1; i <= m; i ++) { int l1 = read(), r1 = read(), l2 = read(), r2 = read(); int k = Log[r1 - l1 + 1]; merge(f[l1][k], f[l2][k]); merge(f[r1 - bit[k] + 1][k], f[r2 - bit[k] + 1][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 = 0, base = 9; for(int i = 1; i <= n; i ++) ans += (find(i) == i); for(int i = 1; i < ans; i ++) base = ((LL) base * 10LL) % mod; printf("%d\n", base); return 0;}

 

转载于:https://www.cnblogs.com/twilight-sx/p/9652638.html

你可能感兴趣的文章
多米诺骨牌
查看>>
Linq 学习(1) Group & Join--网摘
查看>>
asp.net 调用前台JS调用后台,后台掉前台JS
查看>>
Attribute(特性)与AOP
查看>>
第三次作业
查看>>
苹果手表:大方向和谷歌一样,硬件分道扬镳
查看>>
Competing Consumers Pattern (竞争消费者模式)
查看>>
HDUOJ ------1398
查看>>
cf--------(div1)1A. Theatre Square
查看>>
Android面试收集录15 Android Bitmap压缩策略
查看>>
PHP魔术方法之__call与__callStatic方法
查看>>
ubuntu 安装后的配置
查看>>
VSCODE更改文件时,提示:EACCES: permission denied的解决办法(mac电脑系统)
查看>>
web前端之路,js的一些好书(摘自聂微东 )
查看>>
【模板】对拍程序
查看>>
Pycharm安装Markdown插件
查看>>
【转】redo与undo
查看>>
C#更新程序设计
查看>>
解决升级系统导致的 curl: (48) An unknown option was passed in to libcurl
查看>>
Java Session 介绍;
查看>>