分析

依旧是一个连通块题。

观察题面不难发现两个重要性质:

  1. 一个跳棋只能以它旁边的两个跳棋为中点跳跃,且满足跳跃路线中 除中点以外没有其它跳棋阻挡。
  2. 只有我们的跳棋可以移动。
  3. 跳棋的操作具有可逆性/对称性。

第三条性质可以这么理解,就是一个跳棋跳过去之后,它还可以跳回来。

因此,无论我们从左右两边的哪一边开始起跳,都可以跳出最佳路径。

于是我们规定跳棋只能向右跳。(你规定向左跳也可以)

然后发现,跳棋跳的路线,是可以抽象成一条链的。

每次从 \(u\) 点跳向 \(v\) 点,可以看作两者连一条边。

这样链就建好了。

但这样仍然会超时,因为每次我们从链的某个节点进入,走到最后进行查询操作,每个格子进行一遍,就相当于是 \(O(n^2)\) 的复杂度了。

并且还有一个性质,就是我们只注重跳到的最后的结果,而链表又相当于是一种特殊的树。

所以我们想到既可以实现 \(O(1)\) 快速查询,又可以维护儿子与祖先关系的并查集

简化树的操作,便是路径压缩

由于是连通块,所以使用 BFS 看似也可以实现,但我没试过,并且感觉有点难写。或者写遍历树的做法也可以,稍微比 BFS 好写些。实现的好那么上面三种做法都没问题。

时间为 \(O(n)\) 。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m,f[200005],l[200005],r[200005],jp[200005],fr[200005],ans=0;
bool blk[200005];
void init()
{
for(int i=0;i<200005;i++)
{
f[i]=i;
l[i]=i;
r[i]=i;
}
}
int findf(int x)
{
if(f[x]!=x)f[x]=findf(f[x]);
return f[x];
}
void combine(int x,int y)
{
int fx=findf(x),fy=findf(y);
f[fx]=fy;
l[fy]=min(l[fy],l[fx]);
r[fy]=max(r[fy],r[fx]);
}
int main()
{
freopen("jump.in","r",stdin);
freopen("jump.out","w",stdout);
cin>>n>>m;
init();
for(int i=1;i<=m;i++)
{
int a;
cin>>a;
blk[a]=1;
}
for(int i=1;i<=n;i++)
{
fr[i]=fr[i-1];
fr[i]+=blk[i];
}
for(int i=n,b=0x3f3f3f3f;i>=1;i--)
{
if(blk[i])
{
jp[i]=0x3f3f3f3f;
b=i;
continue;
}
jp[i]=b;
}
for(int i=1;i<=n;i++)
{
if(jp[i]>=0x3f3f3f3f)continue;
int p=2*jp[i]-i;
if(p>i&&p<=n&&(fr[p]-fr[i-1])==1)combine(i,p);
}
for(int i=1;i<=n;i++)
{
int fi=findf(i);
ans=max(ans,abs(r[fi]-l[fi]));
}
cout<<ans;
return 0;
}

HT-014 Div3 跳棋 题解 [ 黄 ] [ 并查集 ] [ 链表 ]的更多相关文章

  1. Codeforces #541 (Div2) - F. Asya And Kittens(并查集+链表)

    Problem   Codeforces #541 (Div2) - F. Asya And Kittens Time Limit: 2000 mSec Problem Description Inp ...

  2. 【HNOI2012】永无乡 题解(并查集+线段树合并)

    题目链接 给定一张含$n$个点$m$条边的无向图,每个点有一个重要指数$a_i$.有两种操作:1.在$x$和$y$之间连一条边:2.求$x$所在连通块中重要程度第$k$小的点. ----------- ...

  3. 【CF878C】Tournament set+并查集+链表

    [CF878C]Tournament 题意:有k个项目,n个运动员,第i个运动员的第j个项目的能力值为aij.一场比赛可以通过如下方式进行: 每次选出2个人和一个项目,该项目能力值高者获胜,败者被淘汰 ...

  4. CodeForces 566D Restructuring Company (并查集+链表)

    题意:给定 3 种操作, 第一种 1 u v 把 u 和 v 合并 第二种 2 l r 把 l - r 这一段区间合并 第三种 3 u v 判断 u 和 v 是不是在同一集合中. 析:很容易知道是用并 ...

  5. luoguP1525 关押罪犯 题解(NOIP2010)(并查集反集)

    P1525 关押罪犯  题目 #include<iostream> #include<cstdlib> #include<cstdio> #include<c ...

  6. 100: cf 878C set+并查集+链表

    $des$Berland要举行 $n$ 次锦标赛,第一次只有一个人,之后每一次会新加入一个人.锦标赛中有 $k$ 种运动项目,每个人在这 $k$ 种项目上都有一个能力值,每次会选择任意两个还未被淘汰的 ...

  7. CF469D Two Set (并查集)

    Codeforces Round #268 (Div. 2)D Codeforces Round #268 (Div. 1)B CF468B D. Two Sets time limit per te ...

  8. CF455C Civilization (并查集)

    CF456E Codeforces Round #260 (Div. 1) C Codeforces Round #260 (Div. 2) E http://codeforces.com/conte ...

  9. Educational Codeforces Round 7 C. Not Equal on a Segment 并查集

    C. Not Equal on a Segment 题目连接: http://www.codeforces.com/contest/622/problem/C Description You are ...

  10. Codeforces Round #260 (Div. 1) C. Civilization 并查集,直径

    C. Civilization Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/455/probl ...

随机推荐

  1. pip之加速

    开发的时候, 经常会遇到使用pip安装某个包的时候很慢,甚至安装失败的情况, 当然可以设置--default-timeout=100方法来设置超时时间(默认是15秒),但是并不能解决实质问题.需要进行 ...

  2. HZNU Winter Trainning 7 补题 - Zeoy

    CodeForces - 1660C 题目传送门:https://vjudge.net/contest/535955#problem/C 题意:询问一个字符串最少删去几个字符,能够把这个字符串变成aa ...

  3. 新型大语言模型的预训练与后训练范式,谷歌的Gemma 2语言模型

    前言:大型语言模型(LLMs)的发展历程可以说是非常长,从早期的GPT模型一路走到了今天这些复杂的.公开权重的大型语言模型.最初,LLM的训练过程只关注预训练,但后来逐步扩展到了包括预训练和后训练在内 ...

  4. H5扫码

    1.前言 H5可以获取视频流,并通过video元素进行播放 可以canvas对视频进行定时截图,然后使用插件对图片进行二维码解析 也可以直接对视频进行二维码解析(推荐) 解析二维码的插件为qr-sca ...

  5. WxPython跨平台开发框架之参数配置管理界面的设计和实现

    我曾经在2014年在随笔<Winform开发框架之参数配置管理功能实现-基于SettingsProvider.net的构建>介绍过基于.NET开发的参数配置管理界面,本篇随笔基于类似的效果 ...

  6. PictureMarkerSymbol透明的问题

    由于我使用的是位图图片,所以不可能将图片背景处理成透明.不过还是可以通过参数的设定来达到这种效果. PictureMarkerSymbol pPMS = new PictureMarkerSymbol ...

  7. Docker安装最新版MySQL

    下载docker dnf -y install docker 下载mysql镜像 docker pull mysql 运行Mysql mkdir -p /home/mysql/data docker ...

  8. 对象存储 COS 推出一站式内容审核服务,助力打造绿色互联网

    今年,国家网信办深入推进"清朗·春节网络环境"专项行动.截至3月24日,网信办共累计清理相关违法违规信息208万余条,处置账号7.2万余个,协调关闭.取消备案网站平台2300余家. ...

  9. 【单片机】初次实验:Keil51的使用

    哔哩哔哩/CSDN/博客园:萌狼蓝天 延时器 delay(int count){ int i,j; for(i=0;i<count;i++){ for(j=0;j<1000;j++); } ...

  10. nginx国密ssl测试

    文章目录文件准备编译部署nginx申请国密数字证书配置证书并测试文件准备下载文件并上传到服务器,这里使用centos 7.8 本文涉及的程序文件已打包可以直接下载. 点击下载 下载国密版openssl ...