欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

Codeforces1632DNewYearConcert数据结构维护尺取

时间:2023-06-06
文章目录

题意题解
题目地址 题意

定义一个数字序列中如果有一个连续子序列满足这个子序列的最大公约数等于其长度,则称该序列为无聊的。在可以任意修改数字的情况下,对序列 x x x存在函数 f ( x ) f(x) f(x)定义为使得该序列不无聊至少需要修改数字的个数。给定一个序列,求这个序列每个前缀的 f f f函数值。

题解

我们发现可以将数字改为大质数,这样包含这个数字的区间就不可能无聊。
因此假设长度为 i − 1 i-1 i−1的前缀不无聊,但是长度为 i i i的前缀无聊,则仅需修改第 i i i个数的贪心显然成立。
再根据最大公约数随序列长度增加而减小的单调规律,在右端点不动的情况下,左端点右移,则 g c d gcd gcd不降。那么只需要不断右移左端点,直到 g c d ≥ 区 间 长 度 gcdgeq 区间长度 gcd≥区间长度,然后判断是否相等以及这一段区间是否均未被修改过,若判定成功即修改右端点。这样一来就做完了。
区间 g c d gcd gcd用st表或者线段树这样的数据结构便可处理,主函数做法用二分或者尺取都可以。

#include //Ithea Myse Valguliousconst int yuzu=2e5;typedef ll fuko[yuzu|10];fuko a,lg2={-1};struct sp_table { fuko gcd[21]; void init(int n) { for (int i=1;i<=n;++i) gcd[0][i]=a[i]; for (int i=1;i<=19;++i) { for (int j=1;j+(1<>1]+1; zw.init(n); int ans=0,l=1,ml=-1; for (i=1;i<=n;++i) { for (;lml) { ++ans,ml=i; } printf("%d ",ans); }}

谢谢大家。

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。