【题解】CF356A Knight Tournament
题面传送门
本蒟蒻想练习一下并查集,所以是找并查集标签来这里的。写题解加深理解。
解决思路
自然,看到区间修改之类很容易想到线段树,但本蒟蒻线段树会写挂,所以这里就讲比较简单的并查集思路。
并查集的核心是 \(\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的更多相关文章
- Knight Tournament (set)
Hooray! Berl II, the king of Berland is making a knight tournament. The king has already sent the me ...
- CodeForce 356A Knight Tournament(set应用)
Knight Tournament time limit per test 3 seconds memory limit per test 256 megabytes input standard ...
- Knight Tournament 合并区间
Hooray! Berl II, the king of Berland is making a knight tournament. The king has already sent the me ...
- CodeForces - 357C Knight Tournament 伪并查集(区间合并)
Knight Tournament Hooray! Berl II, the king of Berland is making a knight tournament. The king has a ...
- D - Knight Tournament(set)
Problem description Hooray! Berl II, the king of Berland is making a knight tournament. The king has ...
- codeforces 357C Knight Tournament(set)
Description Hooray! Berl II, the king of Berland is making a knight tournament. The king has already ...
- Knight Tournament
Codeforces Round #207 (Div. 1) A:http://codeforces.com/problemset/problem/356/A 题意:给你n匹马,然后有m场比赛.每场比 ...
- 【Codeforces 356A】Knight Tournament
[链接] 我是链接,点我呀:) [题意] n个人矩形m场比赛 每场比赛由编号为li~ri且之前没有被淘汰的人进行. 已知第i场的winner是xi winner会把这一场其他所有的人都淘汰. 问你n个 ...
- 【题解】Knight Moves-C++
题目Description在一个8*8的棋盘上,一只中国象棋中的马要从一个点跳到另一个点.问最少需要多少步.Input整个测试组由多组数据组成,请做到文件底结束.对于每组数据,前两个坐标代表出发点,后 ...
随机推荐
- 开发个RTMP播放器居然这么难?RTMP播放器对标和考察指标
好多开发者提到,RTMP播放器,不知道有哪些对标和考察指标,以下大概聊聊我们的一点经验,感兴趣的,可以关注 github: 1. 低延迟:大多数RTMP的播放都面向直播场景,如果延迟过大,严重影响体验 ...
- Haproxy部署及控制台使用手册
一.介绍 1.简介 HAProxy是一个使用C语言编写开源软件,提供高可用,负载均衡,以及基于TCP(四层)和HTTP(七层)的应用程序代理: HAProxy特别适用于那些负载特大的web站点,这些站 ...
- day33-线程基础03
线程基础03 6.用户线程和守护线程 用户线程:也叫工作线程,当线程的任务执行完或者通知方法结束.平时用到的普通线程均是用户线程,当在Java程序中创建一个线程,它就被称为用户线程 守护线程(Daem ...
- 网络基础七层模型与TCP/IP协议
1.网络基础 1.1 什么是网络 网络就是计算机网络是一组计算机或网络设备通过有形 的线缆或无形的媒介如无线,连接起来,按照一定的 规则,进行通信的集合. 网络通信就是指终端设备之间通过计算机网络进行 ...
- ProxySQL(1):简介和安装
文章转载自:https://www.cnblogs.com/f-ck-need-u/p/9278818.html ProxySQL有两个版本:官方版和percona版,percona版是在官方版的基础 ...
- 使用SkyWalking监控nginx (以openresty为例)
安装使用SkyWalking先看这篇文章,地址:https://www.cnblogs.com/sanduzxcvbnm/p/15829781.html 使用SkyWalking监控nginx借助的是 ...
- 使用docker-compose方式安装redash
转载自:https://anjia0532.github.io/2019/07/08/redash/ ## 安装必要工具 apt install -y pwgen python-pip pip ins ...
- 不可错过的效能利器「GitHub 热点速览 v.22.39」
如果你是一名前端工程师且维护着多个网站,不妨试试本周榜上有名的 HTML-first 的 Qwik,提升网站访问速度只用一招.除了提升网站加载速度的 Qwik,本周周榜上榜的 Whisper 也是一个 ...
- 如何评判一个企业是否需要实施erp系统?
一个企业是否需要实施ERP系统很大程度上取决于其规模.这里需要向提问者说明的一点是:很多企业上ERP,并不会用得到MRP,ERP是企业资源计划,不是制造业企业专用,MRP也不是ERP必须,金融.保险之 ...
- ToroiseGit/GitBash 设置提交信息模板设置
一.背景:当使用git提交代码时,每次的提交信息固定,却又比较长不好记的时,还需要将模板的地址保存下来,如果能设置一个固定的模板就可以很好的解决这个问题. 提交前的提交信息需要手动输入: 二.Toro ...