分析

依旧是一个连通块题。

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

  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. Python之读写Excel

    现有的Excel分为两种格式:xls(Excel 97-2003)和xlsx(Excel 2007及以上). Python处理Excel文件主要是第三方模块库xlrd.xlwt.pyexcel-xls ...

  2. 不会前端也能写官网?没问题,Devbox+Cursor 带你起飞

    大家平时都是怎么给自己的产品开发官方网站的? 是不是先在本地配置好环境,然后使用 IDE 写代码,写完代码后部署到服务器生成预览链接,团队协作成员再打开浏览器访问,然后你再修改,再部署,再访问,再修改 ...

  3. less 动态样式语言

    1.less的介绍 Less 是一门 CSS 预处理语言,它扩展了 CSS 语言,增加了变量.Mixin.函数等特性,使 CSS 更易维护和扩展 官方文档 2.less需要编译才能被浏览器解析 浏览器 ...

  4. Vue开启Gzip

    Vue配置 1.安装  npm install --save-dev compression-webpack-plugin@5.0.0 const CompressionWebpackPlugin = ...

  5. Qt/C++地图高级绘图/指定唯一标识添加删除修改/动态显示和隐藏/支持天地图高德地图百度地图

    一.前言说明 已经有了最基础的接口用来添加覆盖物,而且还有通过进入覆盖物模式动态添加覆盖物的功能,为什么还要来个高级绘图?因为又有新的需求,给钱就搞,一点底线都没有.无论哪个地图厂家,提供的接口都是没 ...

  6. Qt/C++音视频开发72-倍速推流/音视频同步倍速推流/不改变帧率和采样率/低倍速和高倍速

    一.前言 最近多了个新需求,需要倍速推流,推流界的扛把子obs也有倍速推流功能,最高支持到两倍速.这里所说的倍速,当然只限定在文件,只有文件才可能有倍速功能,因为也只有文件才能倍速解码播放.实时视频流 ...

  7. 🤺Universal and Transferable Adversarial Attacks on😊Aligned Language Models

  8. IDEA导入他人的项目时提示“project sdk is not defined”的解决办法

    IDEA导入他人的项目时提示"project sdk is not defined"的解决办法 1.在IDEA中,在有问题的项目上单击鼠标右键,然后选择"Open Mod ...

  9. 在VS Code中vue引入新版vue-awesome-swiper编译时提示swiper/dist/css/swiper.css无法导入的问题

    在安装vue-awesome-swiper时报错swiper/dist/css/swiper.min.css找不到,如下如: 有的回答安装6.0版本的话需要引入另外一个css import 'swip ...

  10. 认识Token和Cookie

    认识Token和Cookie 1.token和cookie有什么区别? ​ 1.1 存储位置及方式:Cookie是浏览器用来存储本地信息的文件,有一定的存储限制,而Token是由服务器按一定算法生成的 ...