HDU 3461 思维+并查集
Code Lock
题目链接
http://acm.hdu.edu.cn/showproblem.php?pid=3461
Problem Description
A lock you use has a code system to be opened instead of a key. The lock contains a sequence of wheels. Each wheel has the 26 letters of the English alphabet 'a' through 'z', in order. If you move a wheel up, the letter it shows changes to the next letter in the English alphabet (if it was showing the last letter 'z', then it changes to 'a').
At each operation, you are only allowed to move some specific subsequence of contiguous wheels up. This has the same effect of moving each of the wheels up within the subsequence.
If a lock can change to another after a sequence of operations, we regard them as same lock. Find out how many different locks exist?
Input
There are several test cases in the input.
Each test case begin with two integers N (1<=N<=10000000) and M (0<=M<=1000) indicating the length of the code system and the number of legal operations.
Then M lines follows. Each line contains two integer L and R (1<=L<=R<=N), means an interval [L, R], each time you can choose one interval, move all of the wheels in this interval up.
The input terminates by end of file marker.
Output
For each test case, output the answer mod 1000000007
Sample Input
1 1
1 1
2 1
1 2
Sample Output
1
26
题意
1.问题:问你用26个小写字母,能组成长度为n的多少种不同的序列。
2.操作:他会给你m个操作区间,形如[l,r],每次你可以令一个区间里的所有字母往后一位,如a变成b,z变成a.
3.种类判定:如果两个序列进行若干次操作可以变成相同形态,则视为一种序列。
题解
老实说我看了很多题解,但是并没有完全理解,可能是我太弱了,我就大概说一下我自己的一知半解。
1.如果没有操作区间,答案记作\(\large sum=26^n\).
2.假如只有一个可操作的区间[l,r],每一种序列,都可以有26个同种不同样的序列(包括自己),则答案为\(\LARGE \frac{sum}{26}\).
3.如果m个操作区间均不重叠,那么答案为\(\LARGE \frac{sum}{26^n}\).
4.那么有重叠怎么办呢,有重叠实际上只要不是完全一样似乎就没有影响,比如[1,2]和[2,3],对于每一种序列,可以有\(\large 26^2\)个同种不同样的序列。
5.那么什么是完全一样呢,比如[1,3],[4,5]和[1,5]就是完全一样,因为[1,5]的任何变换都可以由[1,3],[4,5]一起完成。
6.最后大牛们用了神奇的并查集,即对于[l,r],就将l和r+1并为同一个集合,记录每次成功合并的次数。(不用快速幂也不会超时)
代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define INF 0x7f7f7f7f
#define N 10000050
const ll mo=1000000007;
int n,m,bl[N];
template<typename T>void read(T&x)
{
ll k=0; char c=getchar();
x=0;
while(!isdigit(c)&&c!=EOF)k^=c=='-',c=getchar();
if (c==EOF)exit(0);
while(isdigit(c))x=x*10+c-'0',c=getchar();
x=k?-x:x;
}
void read_char(char &c)
{while(!isalpha(c=getchar())&&c!=EOF);}
int find(int x){return x==bl[x]?x:bl[x]=find(bl[x]);}
bool merge(int x,int y)
{
x=find(x); y=find(y);
if(x==y)return 0;
bl[y]=x;
return 1;
}
ll kpow(ll x,ll p)
{
ll ans=1;
while(p)
{
if (p&1)ans=ans*x%mo;
p>>=1;
x=x*x%mo;
}
return ans;
}
void work()
{
read(n); read(m);
for(int i=1;i<=n+1;i++)bl[i]=i;
ll p=n,ans=1;
for(int i=1;i<=m;i++)
{
int x,y;
read(x); read(y);
y++;
if(merge(x,y))p--;
}
ans=kpow(26,p);
printf("%lld\n",ans);
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("aa.in","r",stdin);
#endif
while(1)work();
}
HDU 3461 思维+并查集的更多相关文章
- HDU 4496 D-City(并查集,逆思维)
题目 熟能生巧...常做这类题,就不会忘记他的思路了... //可以反过来用并查集,还是逐个加边,但是反过来输出...我是白痴.....又没想到 //G++能过,C++却wa,这个也好奇怪呀... # ...
- B - Rikka with Graph HDU - 5631 (并查集+思维)
As we know, Rikka is poor at math. Yuta is worrying about this situation, so he gives Rikka some mat ...
- HDU 2818 (矢量并查集)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2818 题目大意:每次指定一块砖头,移动砖头所在堆到另一堆.查询指定砖头下面有几块砖头. 解题思路: ...
- 思维+并查集 hdu5652
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5652 题意: 输入T,接下来T个样例,每个样例输入n,m代表图的大小,接下来n行,每行m个数,代表图, ...
- hdu 1116 欧拉回路+并查集
http://acm.hdu.edu.cn/showproblem.php?pid=1116 给你一些英文单词,判断所有单词能不能连成一串,类似成语接龙的意思.但是如果有多个重复的单词时,也必须满足这 ...
- Bipartite Graph hdu 5313 bitset 并查集 二分图
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5313 题意: 给出n个顶点,m条边,问最多添加多少条边使之构成一个完全二分图 存储结构: bitset ...
- hdu 3081(二分+并查集+最大流||二分图匹配)
Marriage Match II Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- 2015 ACM/ICPC Asia Regional Changchun Online HDU - 5441 (离线+并查集)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5441 题意:给你n,m,k,代表n个城市,m条边,k次查询,每次查询输入一个x,然后让你一个城市对(u,v ...
- hdu 3536【并查集】
hdu 3536 题意: 有N个珠子,第i个珠子初始放在第i个城市.有两种操作: T A B:把A珠子所在城市的所有珠子放到B城市. Q A:输出A珠子所在城市编号,该城市有多少个珠子,该珠子转移了 ...
随机推荐
- 洛谷P5369 [PKUSC2018]最大前缀和 [DP]
传送门 思路 这么一道签到题竟然没切掉真是丢人呢-- 首先有一个\(O(3^n)\)的SB方法,记录\(dp_{S,T}\)表示已经填进去了\(S\),当前最大前缀和集合为\(T\),随便转移.太简单 ...
- Magic Points ZOJ - 4032
The 15th Zhejiang Provincial Collegiate Programming Contest Sponsored by TuSimple Magic Points ZOJ - ...
- codeforces392B
CF392B Tower of Hanoi 题意翻译 河内塔是一个众所周知的数学难题.它由三根杆和一些可以滑动到任何杆上的不同尺寸的圆盘组成.难题从一个整齐的杆中开始,按照尺寸从小到大的顺序排列,最小 ...
- Centos 查看CPU个数、核心数等信息
总核数 = 物理CPU个数 X 每颗物理CPU的核数 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数 查看物理CPU个数 cat /proc/cpuinfo| grep & ...
- Windows系统配置Redis密码
1.首先停止Redis服务,直接关掉Redis或者打开任务管理器查看有没有redis-server进程,有的话选中并结束任务. 2.打开配置文件redis.windows.conf和redis.win ...
- OpenResty之ngx_lua模块的加密接口
原文: ngx_Lua模块中的加密api接口 ngx.crc32_short digest = ngx.crc32_short(str) 该方法主要是计算给定字符串 str 的循环校验码(Cyclic ...
- vagrant box镜像百度下载地址
1.centos7 链接:https://pan.baidu.com/s/1JuIUo4HL0lm1EtUKaoMpaA提取码:w9a8 2.vagrant-ubuntu-server-16.04-x ...
- 记录Redis连接未正确释放,TCP连接过多,造成服务器上部分功能不可用和linux服务器内存一直增加问题
问题1 多人共享开发服务器(windows系统),我们小组有个程序,定时检测mongodb,redis,mysql连接是否正常,程序启动一段时间后,服务器管理人员找到我们说,我们的某个pid的程序把T ...
- Web前端学习笔记——Canvas
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8 ...
- Linux中vi编辑器的使用详解
vi编辑器是Linux系统下标准的编辑器.而且不逊色于其他任何最新的编辑器.可是会用的有多少呢.下面介绍一下vi编辑器的简单用法和部分命令.让你在Linux系统中畅行无阻. 基本上vi可以分为三种状态 ...