【CodeForces】582 C. Superior Periodic Subarrays
【题目】C. Superior Periodic Subarrays
【题意】给定循环节长度为n的无限循环数列,定义(l,s)表示起点为l的长度为s的子串,(l,s)合法要求将子串从该起点开始以s为循环节长度无限循环中每个数字都>=数列中对应位置的数字,求合法(l,s)的数量。0<=l<n,1<=s<=n,n<=2*10^5,1<=ai<=10^6。
【算法】数论,计数问题
【题解】先不考虑起点,对于选定的s,子串中的数字必须≥所有间隔为g=gcd(s,n)的数字(核心思想)。
例如在1 2 3 4 5 6,g=2时,1 3 5为一组,2 4 6为一组,子串中如果包含某一组的一个,那个就必须≥整组的数字。
枚举g,对于数列中g个[数字间隔为g的序列],显然每个序列中只有最大的数字才有可能被选择为子串,那么处理后我们得到了01数列。
对于01数列,我们要用连续的1凑出长度s满足gcd(s,n)=g,先使用双指针统计出几段连续的1,对于每一段连续的1枚举长度贡献答案。
复杂度O(d(n)*n),其中d(n)为n的因子个数。
以上为CF官方题解,在处理01序列的时候可以采用一种较简单的写法:
枚举g,预处理c[x]表示长度i=1~x中满足g=gcd(i,n)的 i 的个数。
处理出01序列,然后将链复制一遍,倒着计算出b[i]表示从i出发最长的连续1个数。
最后枚举起点l,每个点贡献答案c[b[i]]。
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=;
int n,a[maxn],b[maxn<<],c[maxn],mx[maxn],gc[maxn];
int gcd(int a,int b){return !b?a:gcd(b,a%b);}
//learn from LIBERATOR
int main(){
scanf("%d",&n);
for(int i=;i<n;i++)scanf("%d",&a[i]);
for(int i=;i<n;i++)gc[i]=gcd(i,n);
long long ans=;
for(int g=;g<n;g++)if(n%g==){
for(int i=;i<=n;i++)c[i]=c[i-]+(gc[i]==g);
for(int i=;i<g;i++)mx[i]=a[i];
for(int i=g;i<n;i++)mx[i%g]=max(mx[i%g],a[i]);
for(int i=;i<n;i++)b[i]=b[i+n]=(mx[i%g]==a[i]);
for(int i=n+n-;i>=;i--)if(b[i])b[i]+=b[i+];
for(int i=;i<n;i++)ans+=c[min(n-,b[i])];
}
printf("%lld",ans);
return ;
}
【CodeForces】582 C. Superior Periodic Subarrays的更多相关文章
- Codeforces Round #323 (Div. 2) E - Superior Periodic Subarrays
E - Superior Periodic Subarrays 好难的一题啊... 这个博客讲的很好,搬运一下. https://blog.csdn.net/thy_asdf/article/deta ...
- 【Codeforces】Round #491 (Div. 2) 总结
[Codeforces]Round #491 (Div. 2) 总结 这次尴尬了,D题fst,E没有做出来.... 不过还好,rating只掉了30,总体来说比较不稳,下次加油 A:If at fir ...
- 【Codeforces】Round #488 (Div. 2) 总结
[Codeforces]Round #488 (Div. 2) 总结 比较僵硬的一场,还是手速不够,但是作为正式成为竞赛生的第一场比赛还是比较圆满的,起码没有FST,A掉ABCD,总排82,怒涨rat ...
- 【CodeForces】601 D. Acyclic Organic Compounds
[题目]D. Acyclic Organic Compounds [题意]给定一棵带点权树,每个点有一个字符,定义一个结点的字符串数为往下延伸能得到的不重复字符串数,求min(点权+字符串数),n&l ...
- 【Codeforces】849D. Rooter's Song
[算法]模拟 [题意]http://codeforces.com/contest/849/problem/D 给定n个点从x轴或y轴的位置p时间t出发,相遇后按对方路径走,问每个数字撞到墙的位置.(还 ...
- 【CodeForces】983 E. NN country 树上倍增+二维数点
[题目]E. NN country [题意]给定n个点的树和m条链,q次询问一条链(a,b)最少被多少条给定的链覆盖.\(n,m,q \leq 2*10^5\). [算法]树上倍增+二维数点(树状数组 ...
- 【CodeForces】925 C.Big Secret 异或
[题目]C.Big Secret [题意]给定数组b,求重排列b数组使其前缀异或和数组a单调递增.\(n \leq 10^5,1 \leq b_i \leq 2^{60}\). [算法]异或 为了拆位 ...
- 【CodeForces】700 D. Huffman Coding on Segment 哈夫曼树+莫队+分块
[题目]D. Huffman Coding on Segment [题意]给定n个数字,m次询问区间[l,r]的数字的哈夫曼编码总长.1<=n,m,ai<=10^5. [算法]哈夫曼树+莫 ...
- 【CodeForces】906 D. Power Tower 扩展欧拉定理
[题目]D. Power Tower [题意]给定长度为n的正整数序列和模数m,q次询问区间[l,r]累乘幂%m的答案.n,q<=10^5,m,ai<=10^9. [算法]扩展欧拉定理 [ ...
随机推荐
- 你代码写得这么丑,一定是因为你长得不好看----panboo第一篇博客
一.个人介绍 我叫潘博,软嵌162,学号1613072055. 以“panboo”名称混迹于各大开源IT论坛与博客. 除了编程,我的最大爱好是篮球与健身,热衷于各种IT技术与运动. 我做过的软件项目有 ...
- Mybatis实现
简介 MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简单的 ...
- TCP系列38—拥塞控制—1、概述
在本篇中我们继续上一篇文章wireshark的示例讲解,上一篇介绍了一个综合示例后,本篇介绍一些简单的示例,在读本篇前建议先把上一篇读完,为了节省篇幅,本篇只针对一些特殊的场景点报文进行讲解,不会像上 ...
- python实现post请求
今天无论如何都要留下一些什么东西... 可以说今天学到一个新的一个东西,也需要分享出来,给更多的人去使用. 今天爬取的数据里面是客户端向服务器端发送加密过的token和一些页码之类的一个数据.(我主要 ...
- 3dContactPointAnnotationTool开发日志(七)
调了半天发现是逻辑错误,改了一下终于没那么奇怪了: 但是有的接触点很明显跑偏了.再回顾一下自己是怎么求的,我是直接用的下面的代码求解一个点是否在另一个物体内部: var bounds = us ...
- 【week3】psp (技术随笔)
本周psp: 随笔字数: 总计 累计代码行 (前两项为单元测试部分) 词频统计:87 四则运算:49 四人小组:39 175 随笔字数 (不包含代码字数) 词频统计:237 四则运算:125 四人小组 ...
- 【week3】词频统计 单元测试
使用Eclipse 集成的Junit进行单元测试.单元测试的核心包括断言.注解. 测试代码如下: @BeforeClass // 针对所有测试,只执行一次,且必须为static void public ...
- PAT L1-048 矩阵A乘以B
https://pintia.cn/problem-sets/994805046380707840/problems/994805082313310208 给定两个矩阵A和B,要求你计算它们的乘积矩阵 ...
- 【Docker 命令】- login 命令
docker login : 登陆到一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub docker logout : 登出一个Docker镜像仓库,如果未指定镜像 ...
- sql sever误删数据库
在sql sever 2008 r2中,我想把一个数据库添加到DATA中,结果发现被占用,我就打算解除占用后再进行复制,本来应该先是让数据库脱离,再复制,结果,我自作聪明地右键数据库,选择了删除,结果 ...