欢迎光临散文网 会员登陆 & 注册

CF竞赛题目讲解_CF452F(线段树+hash)

2022-06-09 16:21 作者:Clayton_Zhou  | 我要投稿


// https://codeforces.com/problemset/problem/452/F

// 一个1到n的排列,请判断该排列内部是否存在一个3个元素的子序列(可以不连续),使得这个子序列是等差序列。n<=3e5

 

// a1,x,a2 是等差数列,则 a1,a2 关于x对称。

// 所以出现在x之前的数据关于x对称,则不存在3个数的等差数列以x为中间项;如果出现在x之前的数据关于x不对称,则存在3个数的等差数列。

// 例如:1,5,3,2,4,出现在3之前的数据1,5关于3对称,则不存在3个数的等差数列1,3,5以3为中间项;

// 1,3,2,4,5,出现在3之前的数据1关于3不对称,则存在3个数的等差数列1,3,5。



// 思路类似于下题

// https://codeforces.com/contest/213/problem/E


//  线段树+hash

// 首先我们可以知道A序列是1~n的排列,那么我们可以先在B序列中把1~n的排列找出来,看其相对位置是否与A相同(hash可做),相同即表明存在一个d=0满足条件。

// 以此类推,我们接下来可以把B中 2~ n + 1的排列找出来,如果其每位-1后相对顺序还是与A序列一致,即存在d=1也满足。。。

// 线段树中保存一个长度为n的序列的hash。

// hash函数值:  a[1]*23^(n-1) + a[2]*23^(n-2) + a[3]*23^(n-3)+  ......   

 

// 另一个线段树例子:CF竞赛题目讲解_CF213E(线段树+hash)

// https://www.bilibili.com/video/BV1KB4y1Q79G?spm_id_from=333.999.0.0


CF竞赛题目讲解_CF452F(线段树+hash)的评论 (共 条)

分享到微博请遵守国家法律