题面传送门

本蒟蒻想练习一下并查集,所以是找并查集标签来这里的。写题解加深理解。

解决思路

自然,看到区间修改之类很容易想到线段树,但本蒟蒻线段树会写挂,所以这里就讲比较简单的并查集思路。

并查集的核心是 \(\text{find}\) 函数。\(\text{find}\) 函数的目的是找到一个节点的父亲,本题中用于快速地找到下一个点搜谁。不带权的 \(\text{find}\) 很好理解也很好写。如果父亲是本身,直接返回即可。否则去找父亲的父亲,并更新。一般这样写:

int find(int x){
if(fa[x]==x) return x;
return fa[x]=find(fa[x]);
}

如果你想压行也可以这样:

int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}

然后是主函数。首先,要把所有节点的父亲赋值为自己。注意,一般要赋到 \(n+1\) 。例如这题,如果只赋到 \(n\) ,那么在找 \(fa_{n+1}\) 时会进入死循环。

接着,对于每一个输入的 \(l,r,x\) ,如果从 \(l\) 到 \(r\) 遍历显然会超时。这时候并查集就发挥作用了。我们可以让 \(j\) 从 \(\text{find(l)}\) 开始,每次都跳到 \(\text{find(j+1)}\),这样可以避免反复扫到已经失败的骑士。之后,在这一范围里,如果 \(j\) \(\ne\) \(x\)(因为不会打败自己),就将 \(ans_j\) 设为 \(x\) 。再修改 \(fa_j\)。若 \(j<x\) 则可将 \(fa_j\) 设为 \(x\),否则就设为 \(r+1\)。这里可以根据 \(fa\) 数组的意义自己理解一下。

最后,只要愉快地输出 \(ans\) 数组就可以了。

注意:数据范围是 \(3\times10^5\),数组开小了会 RE (qwq)。

AC Code

#include<bits/stdc++.h>
using namespace std;
int n,m,fa[300005],ans[300005],l,r,x;
int find(int x){
if(fa[x]==x) return x;
return fa[x]=find(fa[x]);
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n+1;i++) fa[i]=i;
for(int i=1;i<=m;i++){
scanf("%d%d%d",&l,&r,&x);
for(int j=find(l);j<=r;j=find(j+1)){
if(j!=x){
if(j<x) fa[j]=x;
else fa[j]=r+1;
ans[j]=x;
}
}
}
for(int i=1;i<=n;i++) printf("%d ",ans[i]);
return 0;
}

最新文章

  1. 手动获取酷我Mp3外链
  2. web-app1--移动端等比例代码
  3. 69 Spring Interview Questions and Answers – The ULTIMATE List--reference
  4. Ubuntu---2
  5. GCC警告提示错误“cc1:all warnings being treated as errors”
  6. SVN和Maven及Jenkins(转)
  7. ubuntu安装openssh-server
  8. myeclipse 8.6 插件安装之SVN
  9. border-radius是向元素添加圆角边框的方法
  10. 【Netty】Netty核心组件介绍
  11. R读取excel文件乱码 read.xlsx() 解决方法
  12. Confluence DotNet API发布
  13. 海量数据挖掘MMDS week2: 频繁项集挖掘 Apriori算法的改进:非hash方法
  14. 老毛桃pe安装系统
  15. (办公)面试java设计模式
  16. docker 进阶
  17. java框架之Spring(1)-入门
  18. 20190313 org.apache.commons.lang3.builder.EqualsBuilder的两种典型用法
  19. day 018 面向对象--约束和异常处理
  20. GetWindowRect

热门文章

  1. 第六十八篇:vue-cli新建项目
  2. 经纬度转换为距离单位km的方法
  3. 银河麒麟v4_sp4安装英伟达驱动
  4. Windows 11 新材质 Mica Alt 效果展示
  5. Pod的滚动升级过程
  6. 在k8s集群中安装traefik,并结合kuboard界面使用
  7. 1_Layui
  8. java基础-冒泡排序以及稀疏数组
  9. Python实现给图片加水印功能
  10. The XOR Largest Pair (trie树)