洛谷P3295 萌萌哒 并查集 + ST表】的更多相关文章

又切一道紫题!!! 成功的(看了一吨题解之后),我A掉了第二道紫题. 好,我们仔细观察,发现这是一个排列组合问题. 有些限定条件,要相等的地方,我们就用并查集并起来.最后一查有多少个并查集,就有多少个位置可供自由选择. 所以答案就是10^(并查集数),去除前导0:*(9/10) 好,这样我们得到了一个O(mn)算法. 然后我们考虑优化:每个区间可能被合并多次.所以我们有两种选择:线段树/ST表. 考虑到这是ST表例题(???????),我们就来个ST表与并查集联动求解... 我们的ufs[i][…
题目链接 Description 一个长度为\(n\)的大数,用\(S_1S_2S_3...S_n\)表示,其中\(S_i\)表示数的第\(i\)位,\(S_1\)是数的最高位,告诉你一些限制条件,每个条件表示为四个数,\(l_1,r_1,l_2,r_2\),即两个长度相同的区间,表示子串\(S_{l1}S_{l1+1}S_{l1+2}...S_{r1}\)与\(S_{l2}S_{l2+1}S_{l2+2}...S_{r2}\)完全相同. 问满足以上所有条件的数有多少个. 思路 参考 https…
如果给相同的位置连边,最后联通块数是n,最后答案就是$9*10^{n-1}$ 但直接连边是$O(n^2)$的 所以事先处理出一个ST表,每次O(1)地给那个ST表连边 最后再一点一点下放,就是把在这层的同一集合的的左儿子连到一个里,右儿子连到一个里 统计最下面那一层的联通块数量就行了 #include<bits/stdc++.h> #define pa pair<int,int> #define CLR(a,x) memset(a,x,sizeof(a)) using namesp…
传送门 洛谷 Solution 实测跑的比ST表快!!! 这个东西也是\(O(1)\)的,不会可以看我上一篇Blog 代码实现 代码戳这里…
正解:倍增+并查集 解题报告: 传送门! 首先不难想到暴力?就考虑把区间相等转化成对应点对相等,然后直接对应点连边,最后求有几个连通块就好辣 然后看下复杂度,修改是O(n2)查询是O(n),就比较容易想到能不能通过一些技巧变成都是O(nlogn)的,再结合数据范围发现nlogn的复杂度似乎是对的 然后发现我们用的并查集嘛,并查集就有可合并性昂,看到有可合并性的,就要想到几种算法——倍增/线段树/balabala 但是可以发现线段树是不欧克的,因为线段树一定要按二进制划分开来,就会导致两个子节点的…
题目:https://www.luogu.org/problemnew/show/P4092 利用并查集,倒序离线,那么从倒序来看被撤销标记的点就再也不会被标记,所以用并查集跳过: 莫名其妙的WA,调了一晚上,好像是dfs的地方有问题,莫名其妙的:注释掉的是WA的,现有的可以A,不知怎的. 代码如下: #include<iostream> #include<cstdio> using namespace std; ; int n,q,head[MAXN],ct,fa[MAXN],a…
题目背景 “柴门闻犬吠,风雪夜归人”,冬天,不期而至.千里冰封,万里雪飘.空中刮起了鸭毛大雪.雪花纷纷,降落人间. 美能量星球(pty 在 spore 上的一个殖民地)上的人们被这美景所震撼.但是 pty 却不高兴,他不喜欢白色的世界,他觉得这样太单调了.所以他想对雪花进行染色,让世界变得多彩些. 题目描述 现在有 N 片雪花排成一列. Pty 要对雪花进行 M 次染色操作,第 i次染色操作中,把第(i*p+q)%N+1 片雪花和第(i*q+p)%N+1 片雪花之间的雪花(包括端点)染成颜色 i…
两个空洞可互达当且仅当两个空洞相切,即球心距离小于等于球的直径. 一一枚举两个可互达的空洞,并用并查集连起来即可. Code: #include<cstdio> #include<cmath> using namespace std; const int maxn = 1000 + 4; int p[maxn]; int find(int x) { return p[x] == x ? x : p[x] = find(p[x]); } struct Point { double x…
目录 题面 题目链接 题面 题目描述 输入输出格式 输入格式 输出格式: 输入输出样例 输入样例 输出样例 说明 思路 AC代码 总结 题面 题目链接 P3958 奶酪 题面 题目描述 现有一块大奶酪,它的高度为 $ h $ ,它的长度和宽度我们可以认为是无限大的,奶酪 中间有许多 半径相同 的球形空洞.我们可以在这块奶酪中建立空间坐标系,在坐标系中, 奶酪的下表面为 $ z=0 $ ,奶酪的上表面为 $ z=h $ . 现在,奶酪的下表面有一只小老鼠 Jerry,它知道奶酪中所有空洞的球心所在…
题意:有\(n\)个点,对这些点进行\(m\)次染色,第\(i\)次染色会把区间\((i*p+q)\ mod\ N+1\)和\((i*q+p)\ mod\ N+1\)之间的点染成颜色\(i\),问最后这\(n\)个点的颜色. 题解:我们可以反着从第\(m\)次开始染,因为后面的会把前面点的颜色覆盖,所以倒着来的话,下一次染的时候就可以不用考虑已经染过的区间了,那么我们怎么维护染过的区间呢?我们可以把这些区间看成是一些连通块,所以可以用并查集来对区间进行维护,让区间内的所有点均指向它的右端点,具体…
传送门 毒瘤细节题. 首先考虑不合法的情况. 先把相同的值配对,这样就构成了一些区间. 那么如果这些区间有相交的话,就不合法了. 如何判断?DZYO安利了一波st表,我觉得很不错. 接着考虑两个相同的值,它们中间一定只有奇数个数. 然后剩下不合法的情况可以在接下来处理时判断. 接下来还原序列的问题是可以拆分成子问题的. 考虑这两个相同的值夹住的区间. 显然这个区间里是没有值相同的. 对于区间里两个相邻且不全为0的数. 如果是形如0xy0xy0xy的话,我们把0改成y可以变成一个可行解yxyyxy…
我不会ST表 智推推到这个题 发现标签中居然有线段树..? 于是贸然来了一发线段树 众所周知,线段树的查询是log(n)的 题目中"请注意最大数据时限只有0.8s,数据强度不低,请务必保证你的每次查询复杂度为 O(1)" 然后草草打完代码竟然AC了..exm?? 最慢也不过400ms 数据好水 好吧,不多说上代码 首先是数据存贮,分别是左子节点,右子节点,maxx存贮当前节点的最大值 struct node{ int left,right,maxx; }tree[100000*4+10…
题意:给你一组数,询问\(q\)次,问所给区间内的最大值和最小值的差. 题解:经典RMQ问题,用st表维护两个数组分别记录最大值和最小值然后直接查询输出就好了 代码: int n,q; int a[N]; int dp1[N][30],dp2[N][30]; int lg[N]; void lg_Init(){ for(int i=1;i<=n;++i){ int k=0; while(1<<(k+1)<=i) k++; lg[i]=k; } } void RMQ_Init1(){…
题目:https://www.luogu.org/problemnew/show/P2024 自己在做本题时最大的障碍就是:不会在一个集合的father改变时把相应的补集也跟着改变. 借鉴题解后,才明白原来就是把其补集也进行合并:由于fa数组在改变,不要定义一个变量为原来的find()在后面使用. 原来的乱七八糟代码: #include<iostream> #include<cstdio> using namespace std; int n,k,s; int fa[2000005…
洛谷P3295 [SCOI2016]萌萌哒 题目描述 公式粘过来就乱了,还是去洛谷看题吧 分析 如果暴力解决的话就是使用并查集把位数相同的数位并在一起.比如区间[1,2]和区间[3,4]的数字完全相同,那么我们就把1和3并在一起,在把2和4并在一起,这样它们的祖先相同,就相当于把它们绑定在了一起,同一个祖先它们的数字必定相同.这样我们只要最后统计独立的并查集的个数就可以了.我们设个数为n,这样最终的方案数就是9\(\times10\)n-1,因为除了最高位,所有位的数字都可以取到0~9.但是这样…
[BZOJ4569] [Luogu 3295] [SCOI2016]萌萌哒(并查集+倍增) 题面 有一个n位的十进制数a(无前导0),给出m条限制,每条限制\((l_1,r_1,l_2,r_2)(保证r_1-l_1=r_2-l_2)\)表示这个数的第\([l_1,r_1]\)位与\([l_2,r_2]\)位相同.问有多少个这样的数满足条件,答案取模\(10^9+7\), \(n \leq 10^5\) 分析 约定:我们把十进制数a的每一位从高到低称为第1位,第2位...,记为\(a_i\) 首先…
传送门 思路太妙了啊…… 容易才怪想到暴力,把区间内的每一个数字用并查集维护相等,然后设最后总共有$k$个并查集,那么答案就是$9*10^{k-1}$(因为第一位不能为0) 考虑倍增.我们设$f[i][j]$表示区间$[i,i+2^j-1]$,那么我们可以把原区间给拆成$log$个区间,然后维护这些区间的连通性 然而我们最后需要的是最底层的,也就是单独的节点的连通性.那么我们考虑如何将连通性向下传递.如果$f[i][j]$和$f[a][b]$连通,那么$f[i][j-1]$和$f[a][b-1]…
题目:https://www.luogu.org/problemnew/show/P3295 当要连的边形如 “一段区间内都是 i 向 i+L 连边” 的时候,用并查集优化连边. 在连边的时候,如果要连的区间已经有一部分连成这个样子了,就希望跳过这一段. 想倍增那样跳过已经连好的部分.用并查集实现. 建 logn 个并查集,第 i 个并查集里 x 和 y 连通表示 \( [x,x+2^i-1] \) 和 \( [y,y+2^i-1] \) 已经连成了的样子. 那么要连 \( [l1,r1] \)…
P3295 [SCOI2016]萌萌哒 题面 题目描述 一个长度为 \(n\) 的大数,用 \(S_1S_2S_3 \cdots S_n\) 表示,其中 \(S_i\) 表示数的第 \(i\) 位, \(S_1\) 是数的最高位.告诉你一些限制条件,每个条件表示为四个数, \(l_1,r_1,l_2,r_2\) ,即两个长度相同的区间,表示子串 \(S_{l_1}S_{l_1+1}S_{l_1+2} \cdots S_{r_1}\) 与 \(S_{l_2}S_{l_2+1}S_{l_2+2} \…
传送门 一个朴素的做法就是暴力连边并查集,可是这是\(O(n^2)\)的.发现每一次连边可以看成两个区间覆盖,这两个区间之间一一对应地连边.可线段树对应的两个节点的size可能不同,这会导致"一一对应"的条件在线段树上失效.所以我们需要使用ST表来完成连边. 对原序列建好ST表,对于每一个修改将两个区间覆盖到ST表上然后两两之间连边.注意在ST表上连边的两个区间要对应,即如果ST表上对应\([l,r]\)的区间与对应\([L,R]\)的区间连了边,意味着对于\(\forall i \i…
Brief Description 一个长度为n的大数,用S1S2S3...Sn表示,其中Si表示数的第i位,S1是数的最高位,告诉你一些限制条件,每个条 件表示为四个数,l1,r1,l2,r2,即两个长度相同的区间,表示子串Sl1Sl1+1Sl1+2...Sr1与Sl2Sl2+1Sl2+2...S r2完全相同.比如n=6时,某限制条件l1=1,r1=3,l2=4,r2=6,那么123123,351351均满足条件,但是12012,13 1141不满足条件,前者数的长度不为6,后者第二位与第五…
传送门 题意:长为$n \le 10^5$的数字,给出$m \le 10^5$个限制$[l1,r1]\ [l2,r2]$两个子串完全相等,求方案数 把所有要求相等的位置连起来,不就是$9*10^{连通块个数}$嘛 但是最坏情况要连$nm$次啊 有很多都是重复的太浪费了 于是各种乱搞,甚至想了一下分块,即使能减少边的条数也不能减少计算时会走的边的次数 然后看题解,竟然是用倍增来优化 有道理啊,分块太死板了,倍增的话就可以灵活的得到每个区间 $fa[i][j]$表示从i开始$2^j$个数的区间的父亲…
题目 DP,需要注意边界上的问题. 状态定义\(dp[i]\)为句子第i位去除字母的最小值,答案就是\(dp[len]\). 易得状态转移方程为: \[dp[i]=min(dp[i-1]+1,dp[l]+(i-l-len[j]))\]l是保留第j个字符串的右端点,len[j]是第j个字符串的长度. #include <bits/stdc++.h> using namespace std; int w, le, len[1001], dp[1001]; char juzi[1001]; char…
题目描述 Koishi决定走出幻想乡成为数学大师! Flandre听说她数学学的很好,就给Koishi出了这样一道构造题: Task1:试判断能否构造并构造一个长度为的的排列,满足其个前缀和在模的意义下互不相同 Taks2:试判断能否构造并构造一个长度为的的排列,满足其个前缀积在模的意义下互不相同 按照套路,Koishi假装自己根本不会捉,就来找你帮忙辣. 输入输出格式 输入格式: 第一行两个整数和,分别表示Task类型和测试点内的数据组数. 接下来行,每行一个整数表示每组数据中的 输出格式:…
题目 对于任意一个至少两位的正整数n,按如下方式定义magic(n):将n按十进制顺序写下来,依次对相邻两个数写下差的绝对值.这样,得到了一个新数,去掉前导0,则定义为magic(n).若n为一位数,则magic(n)=n. 例如:magic(5913)=482,magic(1198)=081=81,magic(666)=00=0. 对任意一个数n,序列n,magic(n),magic(magic(n)),-迟早会变成一个一位数.最后的这个值称为数n的magic指纹. 例如,对于n=5913,我…
The Suspects Time Limit: 1000MS Memory Limit: 20000K Total Submissions: 31100 Accepted: 15110 Description Severe acute respiratory syndrome (SARS), an atypical pneumonia of unknown aetiology, was recognized as a global threat in mid-March 2003. To mi…
那啥那啥 原本今天还是做(看)差分约束的,但是上不去Vjudge我只能来刷并查集了. %%%静萱大佬把那么多年的noip题都刷遍了,我只能刷水题,noip的题实在是太难了不会啊. 第一道:洛谷P2024食物链   虽然说我很不喜欢看别人代码,但是我认为这道题看代码最容易懂: //Serene #include<algorithm> #include<iostream> #include<cstring> #include<cstdlib> #include&…
题目 还是懒得把题目放上来了. 大意:给你一棵带点权的树,你要花费一些代价选择一些点使得相邻的两个点至少有一个被选. 然后有很多个询问,每个询问强制两个点的状态,问强制了这两个点的状态后的方案. 比赛思路 没时间了,没时间了-- 匆匆打个44分的暴力就好了. 结果混淆了概念,打出来的DP是求一个点自己或周围至少有一个选的方案,和题目就不是一个样子. 比赛结束了,我还没有调处来,然后就爆0了. 解法 先说说暴力. 这是一个非常典型的问题,设fi,0/1f_{i,0/1}fi,0/1​表示以iii为…
题目内容 洛谷链接 一个长度为\(n\)的大数,用\(S_1S_2S_3...S_n\)表示,其中\(S_i\)表示数的第\(i\)位,\(S_1\)是数的最高位,告诉你一些限制条件,每个条件表示为四个数,\(l_1,r_1,l_2,r_2,\)即两个长度相同的区间,表示子串\(S_{l1}S_{l1+1}S_{l1+2}...S_{r1}\)与\(S_{l2}S_{l2+1}S_{l2+2}...S_{r2}\)完全相同.比如\(n=6\)时,某限制条件\(l_1=1,r_1=3,l_2=4,…
题目 一个长度为n的大数,用\(S_1,S_2,S_3...S_n\)表示,其中\(S_i\)表示数的第\(i\)位,\(S_1\)是数的最高位,告诉你一些限制条件,每个条 件表示为四个数,\(l_1,r_1,l_2,r_2\),即两个长度相同的区间,表示子串\(S_{l_1},S_{l_1+1},S+{l_1+2}...S_{r_1}\)与\(S_{l_2},S_{l_2+1},S_{l_2+2}...S_{r2}\)完全相同.比如\(n=6\)时,某限制条件\(l_1=1,r_1=3,l_2…