这个题非常巧妙,它描述了一种新的延迟标记关系。。

正常的线段树是用n*4的空间描述一个序列,所以对于一段区间,有可能会有log个点对应一个点

而线段树是利用尽量小的空间使查询变为log

st表是nlogn的空间,对于一段区间,是可以做到一一对应的,它只是预处理比线段树暴力了一些

所以这个题要放到线段树上的话就需要对两个区间进行拆分,在线段树的节点上更新father数组

这样散开的点有可能是log^2的,而且给点打标记比较麻烦

而st表的话,由于区间长度是一一对应的,所以只需要打两个标记,重叠的标记用并查集并起来

然后就相当于线段树的枚举单点查询操作了,一层层的pushdown(不是一层层的也可以,不过麻烦)

这个题对于暴力并查集的优化就是对区间也用并查集,用延迟标记的叠加来减少重复操作

码:

#include<iostream>
#include<cstdio>
#define P 1000000007
using namespace std;
int f[100005][25],o,n,m,i,j,er[25],l1,l2,r1,r2,cnt,ans;
int zhao(int o,int x)
{if(f[o][x]!=o)f[o][x]=zhao(f[o][x],x);return f[o][x];
}
int main()
{
scanf("%d%d",&n,&m);
er[0]=1;
for(i=1;i<=20;i++)er[i]=er[i-1]*2;
for(i=1;i<=n;i++)
for(j=0;j<=20;j++)
f[i][j]=i;
for(j=1;j<=m;j++)    {scanf("%d%d%d%d",&l1,&r1,&l2,&r2);int o=r1-l1+1;for(i=0;i<=20;i++)if(er[i]&o) {int f1=zhao(f[l1][i],i),f2=zhao(f[l2][i],i);       if(f1!=f2)f[f1][i]=f2;
l1+=er[i];
l2+=er[i];            }}for(j=20;j>=1;j--){for(i=1;i<=n;i++)
{//分下去  if(i+er[j]-1>n)continue;
o=zhao(i,j);int ll=zhao(o,j-1);int lll=zhao(i,j-1);f[ll][j-1]=lll;  int rr=zhao(o+er[j-1],j-1);int rrr=zhao(i+er[j-1],j-1);f[rr][j-1]=rrr;
}               }for(i=1;i<=n;i++)if(zhao(i,0)==i)++cnt;ans=9;for(i=1;i<cnt;i++)ans=1ll*ans*10%P;printf("%d",ans);
}

bzoj4569 [Scoi2016]萌萌哒 并查集+st表相关推荐

  1. BZOJ4569: [Scoi2016]萌萌哒

    4569: [Scoi2016]萌萌哒 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 961  Solved: 464 [Submit][Statu ...

  2. [bzoj4569][SCOI2016]萌萌哒

    题目大意 有一个无前导0的n位数,有m个限制形如[l1,r1]=[l2,r2],问满足条件的数有多少种,答案模10^9+7. 倍增 我们用ST表,f[i,j]表示[i,i+2^j-1]这一段. 那么初 ...

  3. BZOJ4569 [Scoi2016]萌萌哒

    一眼觉得是并查集,yy了一下线段树优化发现不可sing,orz了ljss神犇被告知是倍增优化 倍增,一个点[i][j]代表某个i往后2^j个数,把点按倍增次数分层,两个同层的点在一个连通块说明两个点所 ...

  4. bzoj4569[Scoi2016]萌萌哒

    Description 给出一个有n位的无前导0正整数,再给出m个限制,每个限制形如l1-r1,l2..r2表示这个数的l1~r1位和第l2~r2位是相等的.求这样的数的个数. n,m<=10^ ...

  5. 【BZOJ4569】萌萌哒,ST表+并查集

    Time:2016.08.03 Author:xiaoyimi 转载注明出处谢谢 传送门 思路: sunshine爷模拟题之一 自认计数类问题还可以的我找了半天规律也只会50分做法: 对于每个询问直接 ...

  6. NOIp 数据结构专题总结 (1):STL、堆、并查集、ST表、Hash表

    系列索引: NOIp 数据结构专题总结 (1) NOIp 数据结构专题总结 (2) STL structure std::vector #include <vector> std::vec ...

  7. 洛谷P3295 [SCOI2016]萌萌哒(倍增+并查集)

    传送门 思路太妙了啊-- 容易才怪想到暴力,把区间内的每一个数字用并查集维护相等,然后设最后总共有$k$个并查集,那么答案就是$9*10^{k-1}$(因为第一位不能为0) 考虑倍增.我们设$f[i] ...

  8. 2017百度之星程序设计大赛 - 资格赛【1001 Floyd求最小环 1002 歪解(并查集),1003 完全背包 1004 01背包 1005 打表找规律+卡特兰数】...

    度度熊保护村庄 Accepts: 13 Submissions: 488 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/3276 ...

  9. 基础数据结构(二):字典树、并查集、堆、哈希表、字符串的哈希方式、STL的常见容器及其接口

    文章目录 一.字典树Trie 1 原理 2 Trie字符串统计 3 [LeetCode 208. 实现 Trie (前缀树)](https://leetcode-cn.com/problems/imp ...

最新文章

  1. 唐山一个葬礼上的豪华车队
  2. mysql -ss -e_课内资源 - 基于ssm框架和mysql的网上选课系统
  3. 64位Linux下JVM内存调设遇到GC问题的备忘
  4. vim学习日志(5):vim下wimrc的配置,解决中文乱码问题
  5. Android之自定义ContentProvider详解
  6. linux 高可用----keepalived+lvs
  7. iOS CoreData版本升级和数据库迁移
  8. Unicode和ANSI之间转换 - NotePad++轻松实现
  9. 关于Java中的GUI事件处理
  10. 百度语义预训练ERNIE实现物流信息抽取任务
  11. OpenCV调用摄像头+灰度图+高斯滤波+Canny算子
  12. 详解YUV系列(二)--YUV422
  13. disruptor流程
  14. 【观点讨论与支撑】读书到底有没有用?
  15. Gaze Estimation学习笔记(1)-Appearance-Based Gaze Estimation in the Wild
  16. 如何安装python解释器_python基础系列教程——Python的安装与测试:python解释器、PyDev编辑器、pycharm编译器...
  17. [luoguP1373] 小a和uim之大逃离(DP)
  18. 调用企业微信API发送文本,图片,文件消息
  19. tp摄像头的默认地址_TP-LINK摄像头支持IP地址自动跟随啦!
  20. 限流器(一):guava应用级限流器RateLimiter之SmoothBursty

热门文章

  1. android 测试人员测试时使用release版本还是debug版本_为什么做软件测试
  2. MATLAB矩阵的分解与变换
  3. 设计模式笔记十九:备忘录模式
  4. 【Paper-Attack】MGA:Momentum Gradient Attack on Network
  5. 特征工程系列学习(一)简单数字的奇淫技巧
  6. 安卓PHP maker汉化,android 百度地图marker添加自定义视图
  7. 酷安电脑版_2020年末 平板电脑购买推荐
  8. servlet-cookie实现向客户端写cookie信息
  9. reids mysql 面试_月薪3k的后端面试点-Mysql和Redis
  10. 如何快速的入门Docker并且实现部署