【题解】SCOI2006萌萌哒
看到这题,首先想到\(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萌萌哒的更多相关文章
- ETO的公开赛T4《对抗水滴》 题解(BY 萌萌哒123456 )
题意: 给你一个\(n*n\)的矩阵A,其中有\(T\)个元素不为零.定义矩阵内元素\((x,y)\)的能量值 \(E[x][y]=\sum_{i=1}^{x}\sum_{j=1}^{y}[A[i][ ...
- ETO的公开赛T2《宏聚变》 题解(BY 萌萌哒123456 )
我们注意到这道题中最多有 $(n+q)$ 个数被加入,而每个数最多被删除一次,因此每次操作 $O(logn)$的复杂度是可以接受的. 我们对于$1..100000$之间每个数分别开一个set,维护这个 ...
- 1754: [Usaco2005 qua]Bull Math
1754: [Usaco2005 qua]Bull Math Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 398 Solved: 242[Submit ...
- 2272: [Usaco2011 Feb]Cowlphabet 奶牛文字
2272: [Usaco2011 Feb]Cowlphabet 奶牛文字 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 138 Solved: 97 ...
- 1593: [Usaco2008 Feb]Hotel 旅馆
1593: [Usaco2008 Feb]Hotel 旅馆 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 391 Solved: 228[Submit ...
- 1657: [Usaco2006 Mar]Mooo 奶牛的歌声
1657: [Usaco2006 Mar]Mooo 奶牛的歌声 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 526 Solved: 365[Submi ...
- 1821: [JSOI2010]Group 部落划分 Group
1821: [JSOI2010]Group 部落划分 Group Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1308 Solved: 627[Su ...
- 1022: [SHOI2008]小约翰的游戏John
1022: [SHOI2008]小约翰的游戏John Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 1322 Solved: 829[Submit][ ...
- P3295 萌萌哒 题解
题目 一个长度为n的大数,用\(S_1,S_2,S_3...S_n\)表示,其中\(S_i\)表示数的第\(i\)位,\(S_1\)是数的最高位,告诉你一些限制条件,每个条 件表示为四个数,\(l_1 ...
随机推荐
- PostgreSQL 使用总结
1. USING的使用 USING是个缩写的概念:它接收一个用逗号分隔的字段名字列表, 这些字段必须是连接表共有的,最终形成一个连接条件,表示这些字段对必须相同. USING (a, b, c) 等效 ...
- CakePHP中回调函数的使用
我们知道模型主要是用来处理数据的,有时我们想在模型操作之前或之后做一些额外逻辑处理,这时候就可以使用回调函数. 回调函数有很多种,beforeFind,afterFind,beforeValidate ...
- 对JSON的理解
JSON语法: JSON是一种结构化数据,它是一种数据格式 JSON可以概括为三种类型:简单值.对象.数组 注意:JSON不支持变量.函数和对象实例 一.JSON简单值 包括字符串.数值.布尔值.和n ...
- Qt-QML-Button-ButtonStyle-实现鼠标滑过点击效果
上次实现的自定义的Button功能是用的自定义的Rectangle来实现的,在慢慢的接触了QML之后,发现QML有自己定义的Button 这里盗版贴上Qt帮助文档中的部分关于Button的属性内容 B ...
- 【Mybatis】 逆向生成工程
前言: 必需学会Maven and SQL基础知识 简介: 通过 Maven, Mybatis 逆向生成 Pojo, Mapper, Example(本章屏蔽了) 工具: JDK8 apache-ma ...
- 为什么安装beego和框架的失败 以及常用命令
1.安装了几个版本,版本之间相互影响. 把没用的删掉 2.网上找的教程存在问题. 都是相互抄袭.最权威的还是官网. which go rm -rf test/ echo path 获取路径 vim ~ ...
- window.open()与window.showModalDialog区别
window.open()与window.showModalDialog区别 弹出窗口两种方式: 1.window.showModalDialog: var feature = &qu ...
- 小茜(xi)的减肥之路
Description 今天,多年未见的小钧和小江在街头偶遇,小江想看看当年那个蠢蠢的小钧有没有变聪明一些,他灵机一动,说:“当初小茜立了个flag,说一定要减肥,她想着第一天跑一米,第二天跑两米,第 ...
- c#,mysql,读取乱码问题
1.首先保证数据库的表是UTF8类型:数据库是否是utf8无关紧要: 2.c#连接数据库语句添加“charset=utf8”一句:.exe.config是否添加这一句也无关紧要: 3.访问数据库数据用 ...
- Android开发随笔5
昨天: 对界面的进一步设计补充 可以在界面之间的跳转 研究了对图标等的操作 今天: 实现对库的相关操作 学习视视频内容‘ 复习java的一些知识.