热门标签 | 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


推荐阅读
  • 本文介绍如何使用线段树解决洛谷 P1531 我讨厌它问题,重点在于单点更新和区间查询最大值。 ... [详细]
  • 单片微机原理P3:80C51外部拓展系统
      外部拓展其实是个相对来说很好玩的章节,可以真正开始用单片机写程序了,比较重要的是外部存储器拓展,81C55拓展,矩阵键盘,动态显示,DAC和ADC。0.IO接口电路概念与存 ... [详细]
  • 在尝试对 QQmlPropertyMap 类进行测试驱动开发时,发现其派生类中无法正常调用槽函数或 Q_INVOKABLE 方法。这可能是由于 QQmlPropertyMap 的内部实现机制导致的,需要进一步研究以找到解决方案。 ... [详细]
  • 开发笔记:实现1353表达式中的括号匹配(栈的应用) ... [详细]
  • 在C++程序中,文档A的每一行包含一个结构体数据,其中某些字段可能包含不同数量的数字。需要将这些结构体数据逐行读取并存储到向量中,随后不仅在控制台上显示,还要输出到新创建的文档B中。希望得到指导,感谢! ... [详细]
  • 在Android平台中,播放音频的采样率通常固定为44.1kHz,而录音的采样率则固定为8kHz。为了确保音频设备的正常工作,底层驱动必须预先设定这些固定的采样率。当上层应用提供的采样率与这些预设值不匹配时,需要通过重采样(resample)技术来调整采样率,以保证音频数据的正确处理和传输。本文将详细探讨FFMpeg在音频处理中的基础理论及重采样技术的应用。 ... [详细]
  • 在 Linux 环境下,多线程编程是实现高效并发处理的重要技术。本文通过具体的实战案例,详细分析了多线程编程的关键技术和常见问题。文章首先介绍了多线程的基本概念和创建方法,然后通过实例代码展示了如何使用 pthreads 库进行线程同步和通信。此外,还探讨了多线程程序中的性能优化技巧和调试方法,为开发者提供了宝贵的实践经验。 ... [详细]
  • 详解 Qt 串口通信程序全程图文 (4)
    Qt串口通信程序全程图文是本文介绍的内容,本文一开始先讲解对程序的改进,在文章最后将要讲解一些重要问题。1、在窗口中加入一些组合框ComboBox&# ... [详细]
  • Codeforces竞赛解析:Educational Round 84(Div. 2评级),题目A:奇数和问题
    Codeforces竞赛解析:Educational Round 84(Div. 2评级),题目A:奇数和问题 ... [详细]
  • Android 构建基础流程详解
    Android 构建基础流程详解 ... [详细]
  • MSP430F5438 ADC12模块应用与学习心得
    在最近的实践中,我深入研究了MSP430F5438的ADC12模块。尽管该模块的功能相对简单,但通过实际操作,我对MSP430F5438A和MSP430F5438之间的差异有了更深刻的理解。本文将分享这些学习心得,并探讨如何更好地利用ADC12模块进行数据采集和处理。 ... [详细]
  • 使用Maven JAR插件将单个或多个文件及其依赖项合并为一个可引用的JAR包
    本文介绍了如何利用Maven中的maven-assembly-plugin插件将单个或多个Java文件及其依赖项打包成一个可引用的JAR文件。首先,需要创建一个新的Maven项目,并将待打包的Java文件复制到该项目中。通过配置maven-assembly-plugin,可以实现将所有文件及其依赖项合并为一个独立的JAR包,方便在其他项目中引用和使用。此外,该方法还支持自定义装配描述符,以满足不同场景下的需求。 ... [详细]
  • 2018 HDU 多校联合第五场 G题:Glad You Game(线段树优化解法)
    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6356在《Glad You Game》中,Steve 面临一个复杂的区间操作问题。该题可以通过线段树进行高效优化。具体来说,线段树能够快速处理区间更新和查询操作,从而大大提高了算法的效率。本文详细介绍了线段树的构建和维护方法,并给出了具体的代码实现,帮助读者更好地理解和应用这一数据结构。 ... [详细]
  • 在2019年寒假强化训练中,我们深入探讨了二分算法的理论与实践应用。问题A聚焦于使用递归方法实现二分查找。具体而言,给定一个已按升序排列且无重复元素的数组,用户需从键盘输入一个数值X,通过二分查找法判断该数值是否存在于数组中。输入的第一行为一个正整数,表示数组的长度。这一训练不仅强化了对递归算法的理解,还提升了实际编程能力。 ... [详细]
  • 本文详细介绍了在CodeUp平台中实现大数进制转换的技术方法。具体而言,该问题要求将一个最多包含30位数字的十进制非负整数转换为二进制表示。输入数据包含多行,每行包含一个不超过30位的十进制非负整数。通过高效的算法设计,确保了大数转换的准确性和性能。 ... [详细]
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社区 版权所有