热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

洛谷P3295萌萌哒[SCOI2016]倍增+并查集

正解:倍增+并查集 解题报告: 传送门! 最近考试考到了一道类似的题然后就想起这道回来看下,发现题解写得奇奇怪怪的我我我重构下$QwQ$ 首先不难想到暴力?就考虑把区间相等转化成对应点对相等
正解:倍增+并查集 解题报告:

传送门!

最近考试考到了一道类似的题然后就想起这道回来看下,发现题解写得奇奇怪怪的我我我重构下$QwQ$

首先不难想到暴力?就考虑把区间相等转化成对应点对相等,然后直接对应点连边,最后求有几个连通块就好辣

然后看下复杂度,修改是$O(n^2)$查询是$O(n)$,就比较容易想到能不能通过一些技巧变成都是$O(nlogn)$的,结合数据范围发现$nlogn$的复杂度似乎是对的,于是就往这个方面想呗.就不难想到倍增和线段树.

考虑倍增,设$f_{i,j}$表示$[i,i+2^j-1]$这一段区间的信息.然后每次赋值操作就可以二进制拆分成$log$个区间,然后直接赋值$f_{l_1,j}=f_{l_2,j}$.

最后回答询问的时候把所有相等关系下放下去,就$f_{i,j}=f_{i,j+1},f_{i,i+2^{j-1}}=f_{i,j+1}$.

最后统计下联通块个数$cnt$,答案就$10^{cnt}$.

其实是有点类似线段树的$lazy\_tag$操作的$QwQ$

#include
using namespace std;
#define il inline
#define ll long long
#define rg register
#define gc getchar()
#define rp(i,x,y) for(rg int i&#61;x;i<&#61;y;&#43;&#43;i)
#define my(i,x,y) for(rg int i&#61;x;i>&#61;y;--i)
const int N&#61;1e5&#43;10,mod&#61;1e9&#43;7;
int n,m,f[N][20],poww[20],cnt;
ll as&#61;9;
il int read()
{
rg char ch&#61;gc;rg int x&#61;0;rg bool y&#61;1;
while(ch!&#61;&#39;-&#39; && (ch>&#39;9&#39; || ch<&#39;0&#39;))ch&#61;gc;
if(ch&#61;&#61;&#39;-&#39;)ch&#61;gc,y&#61;0;
while(ch>&#61;&#39;0&#39; && ch<&#61;&#39;9&#39;)x&#61;(x<<1)&#43;(x<<3)&#43;(ch^&#39;0&#39;),ch&#61;gc;
return y?x:-x;
}
il void pre(){poww[0]&#61;1;rp(i,1,19)poww[i]&#61;poww[i-1]<<1;rp(i,1,n)rp(j,0,20)f[i][j]&#61;i;}
int fd(int x,int lth){return f[x][lth]&#61;&#61;x?x:f[x][lth]&#61;fd(f[x][lth],lth);}
il void merg(int x,int y,int lth){int fax&#61;fd(x,lth),fay&#61;fd(y,lth);if(fax!&#61;fay)f[fax][lth]&#61;fay;}
int main()
{
// freopen("mmd.in","r",stdin);freopen("mmd.out","w",stdout);
n&#61;read();m&#61;read();pre();
while(m--){int l1&#61;read(),r1&#61;read(),l2&#61;read(),r2&#61;read();my(i,19,0)if(l1&#43;poww[i]-1<&#61;r1)merg(l1,l2,i),l1&#43;&#61;poww[i],l2&#43;&#61;poww[i];}
my(j,19,1)rp(i,1,n-poww[j]&#43;1)merg(i,fd(i,j),j-1),merg(i&#43;poww[j-1],fd(i,j)&#43;poww[j-1],j-1);
rp(i,1,n)if(fd(i,0)&#61;&#61;i)&#43;&#43;cnt;rp(i,1,cnt-1)as&#61;as*10,as%&#61;mod;
printf("%lld\n",as);
return 0;
}

放个代码就麻油辣QAQ


推荐阅读
  • 本文讲述了CodeForces1016C题目的解法。文章首先介绍了一种错误的理解,然后给出了正确的解法。其中,当位于一个角上时,有两种选择,一种是先一直走一行再返回来走,另一种是走到这一列的另一行上然后再往右走一列。作者给出了两种解法,一种是直接计算,一种是动态规划。最后,取两种解法的最优解作为答案。文章附上了源代码。 ... [详细]
  • 题目描述Takuru是一名情报强者,所以他想利用他强大的情报搜集能力来当中间商赚差价。Takuru的计划是让Hinae帮他去市场上买一个商品,然后再以另一个价格卖掉它。Takur ... [详细]
  • DescriptionclickmeSolution套路的状压期望DP题。。。考虑倒退期望:设fi,jrolepresentationstyleposi ... [详细]
  • 题面传送门Solution看到什么最大值最小肯定二分啊。check直接跑一个二分图匹配就好了。orzztl!!!代码实现*mail:mle ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 本文由编程笔记#小编整理,主要介绍了关于数论相关的知识,包括数论的算法和百度百科的链接。文章还介绍了欧几里得算法、辗转相除法、gcd、lcm和扩展欧几里得算法的使用方法。此外,文章还提到了数论在求解不定方程、模线性方程和乘法逆元方面的应用。摘要长度:184字。 ... [详细]
  • P2765魔术球问题这道题的思路实在是太罕见了,所以发一篇blog从某一新放入的球开始看起1.放入原来的柱子上2.放入新的柱子并将每个点进行拆点࿰ ... [详细]
  • 开发笔记:城市建设
    本文由编程笔记#小编为大家整理,主要介绍了城市建设相关的知识,希望对你有一定的参考价值。本文涉及:cdq分治、MST一道十分精妙的cdq分 ... [详细]
  •   并查集是一种群众喜闻乐见的数据结构,其复杂度是数据结构中最奇葩的之一了,Tarjan证明其为阿克曼函数的反函数,在可以想象(不全面的解释啊)的范围内小于等于3。。。我们就把它当做O(1)吧。下面通 ... [详细]
  • 捕获图像,用KMPlayer很容易实现。编码,用了强大的maltab生成3000多张用于播放的字符文本。图像的标号为1(1) ... [详细]
  • 为什么即使Linux服务器的socket关闭,客户端仍能调用一次send函数?
    要弄清这个问题,首先需要知道调用send()发送数据时,发生了什么。当调用send()发送数据时,并不是直接将数据发送到网络中,而是先将待发送的数据放到socket发送缓冲区中,然 ... [详细]
  • C语言函数的定义及其含义
    本文目录一览:1、C语言函数的特点及其定义?2 ... [详细]
author-avatar
hexin01
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有