题面传送门

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

解决思路

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

并查集的核心是 \(\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;
}

【题解】CF356A Knight Tournament的更多相关文章

  1. Knight Tournament (set)

    Hooray! Berl II, the king of Berland is making a knight tournament. The king has already sent the me ...

  2. CodeForce 356A Knight Tournament(set应用)

     Knight Tournament time limit per test 3 seconds memory limit per test 256 megabytes input standard ...

  3. Knight Tournament 合并区间

    Hooray! Berl II, the king of Berland is making a knight tournament. The king has already sent the me ...

  4. CodeForces - 357C Knight Tournament 伪并查集(区间合并)

    Knight Tournament Hooray! Berl II, the king of Berland is making a knight tournament. The king has a ...

  5. D - Knight Tournament(set)

    Problem description Hooray! Berl II, the king of Berland is making a knight tournament. The king has ...

  6. codeforces 357C Knight Tournament(set)

    Description Hooray! Berl II, the king of Berland is making a knight tournament. The king has already ...

  7. Knight Tournament

    Codeforces Round #207 (Div. 1) A:http://codeforces.com/problemset/problem/356/A 题意:给你n匹马,然后有m场比赛.每场比 ...

  8. 【Codeforces 356A】Knight Tournament

    [链接] 我是链接,点我呀:) [题意] n个人矩形m场比赛 每场比赛由编号为li~ri且之前没有被淘汰的人进行. 已知第i场的winner是xi winner会把这一场其他所有的人都淘汰. 问你n个 ...

  9. 【题解】Knight Moves-C++

    题目Description在一个8*8的棋盘上,一只中国象棋中的马要从一个点跳到另一个点.问最少需要多少步.Input整个测试组由多组数据组成,请做到文件底结束.对于每组数据,前两个坐标代表出发点,后 ...

随机推荐

  1. HCNP Routing&Switching之MAC地址防漂移

    前文我们了解了二层端口安全技术相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/16631222.html:今天我们来聊一聊MAC地址防漂移技术: 首先我 ...

  2. .Net+Vue3实现数据简易导入功能

    在开发的过程中,上传文件或者导入数据是一件很常见的事情,导入数据可以有两种方式: 前端上传文件到后台,后台读取文件内容,进行验证再进行存储 前端读取数据,进行数据验证,然后发送数据到后台进行存储 这两 ...

  3. KingbaseES V8R6 ksql 关闭自动提交

    背景 用过oracle或mysql的人都知道,做一个dml语句,如果发现做错了,还可以rollback,但在Kingbase ksql 中,如果执行一个dml,没有先运行begin; 的话,一执行完就 ...

  4. KingbaseES不同字符类型比较转换规则

    Postgresql 常用的字符数据类型的有char.varchar和text,其中 char 固定长度类型, varchar 和 text 是可变长度类型.这三种类型在进行比较时,会进行隐含的类型转 ...

  5. Python入门系列(十一)一篇搞定python操作MySQL数据库

    开始 安装MySQL驱动 $ python -m pip install mysql-connector-python 测试MySQL连接器 import mysql.connector 测试MySQ ...

  6. Python 第三次实验

    一如既往地简单,不到半个小时即可完成 [1] (程序设计)输入一个正整数,输出它的因子分解式.如输入132,则输出132=122311 n=int(input()) print(1,end='') f ...

  7. 不懂 Kubernetes 实现云原生是什么体验?

    云原生的本质和最终效果 要明白什么是云原生,就要先弄明白云计算是什么有什么问题,云计算将计算资源.网络.存储等基础设施统一管理,通过资源规模化和自动化管理,实现降低资源的成本和提高资源的管理效率,云计 ...

  8. Windows Server Backup保留副本数量的问题

    在配置Windows Server Backup的时候可以配置备份时间点和备份存放位置,但是无法配置保留备份的数量.作为微软提供的一个基本的备份工具,做简单的备份还是可以的.但是对于同一备份任务,反复 ...

  9. 从EDR的火热看安全产品的发展

    从EDR的火热看安全产品的发展 2021年4月8日23:13 当开始写这篇博客时,外面正是护网进行得如火如荼的时候.作为一个产品经理,在吃瓜的同时,也在思考着安全产品的发展.这几年一些看得到的变化在深 ...

  10. STL堆排序&时间复杂度分析

    1. 逻辑&时间复杂度分析 pop 和 initialize 的时间复杂度请参考: [DSAAinC++] 大根堆的pop&remove&initialize 将数组初始化为一 ...