codeforces582C. Superior Periodic Subarrays
来源:互联网 发布:北京行知实验小学 编辑:程序博客网 时间:2024/05/18 01:23
传送门:http://codeforces.com/problemset/problem/582/C
思路:首先观察题目条件,对于一个数a[i]能出现在“Superior Periodic Subarrays”
首先它要满足对于任意k属于N,a[i]>=a[i+k*n]
并且对于任意k属于N,a[i]>=a[i+k*s]
那么就是任意k属于N,a[i]>=a[i+k*d](d=gcd(s,n))
也就是a[i]是这些数中的最大值
于是我们枚举d=gcd(s,n)
显然d整除n
再求出f[i]表示以i结尾的最长“Superior Periodic Subarrays”长度
再记 cnt[i]表示1-i中有多少个j满足gcd(j,n)==d(可以改为gcd(j/d,n/d)==1)
那么这次对答案的贡献就是cnt[f[i]]
累加起来即可。
#include<cstdio>#include<cstring>#include<algorithm>const int maxn=400010; typedef long long ll;using namespace std;int n,f[maxn],a[maxn],g[maxn],cnt[maxn];ll ans;bool bo[maxn];int gcd(int a,int b){return !b?a:gcd(b,a%b);}int main(){scanf("%d",&n);for (int i=0;i<n;i++) scanf("%d",&a[i]),a[i+n]=a[i];for (int d=1;d<n;d++){//枚举GCD(n,s)if (n%d==0){memset(bo,0,sizeof(bo));for (int k=0;k<d;k++){//枚举起点g[k]=0;for (int i=k;i<(n<<1);i+=d) g[k]=max(g[k],a[i]);//找出这些相隔为d的数之间最大的数for (int i=k;i<(n<<1);i+=d) if (a[i]==g[k]) bo[i]=1;//如果一个数是这些数中最大的才可能在子数列中 }f[0]=bo[0];//以i结尾的"卓越子序列"最长可能长度 for (int i=1;i<(n<<1);i++){if (bo[i]) f[i]=f[i-1]+1;else f[i]=0;f[i]=min(f[i],n-1);}cnt[0]=0;//1-i中有多少个数与n的gcd为枚举的d for (int i=1;i<(n/d);i++) cnt[i]=cnt[i-1]+(gcd(i,n/d)==1);//要把Gcd(s,n)==d化简成gcd(s/d,n/d)==1,不然会被卡 for (int i=n;i<(n<<1);i++) ans+=cnt[f[i]/d];/*for (int i=1;i<n;i++) cnt[i]=cnt[i-1]+(gcd(i,n)==d);for (int i=n;i<(n<<1);i++) ans+=cnt[f[i]];*/}}printf("%I64d\n",ans);return 0;}/*1807 6 5 10 3 2 7 3 5 8 8 10 7 6 5 10 3 2 7 3 5 8 8 10 7 6 5 10 1 2 7 3 5 8 1 10 7 6 5 10 3 2 7 3 1 8 8 10 7 6 5 10 3 1 7 3 1 8 8 10 7 6 5 10 3 2 7 1 5 8 8 10 7 6 5 10 3 2 7 3 5 8 8 10 7 6 5 10 3 2 7 3 5 8 8 10 7 6 5 10 3 2 7 3 5 8 8 10 7 6 5 10 3 2 7 3 5 8 8 10 7 6 5 10 1 1 7 3 5 8 8 10 7 6 5 10 3 2 7 3 5 8 8 10 7 6 5 10 3 2 7 3 5 8 8 10 1 6 5 10 3 2 7 3 5 8 1 10 7 6 5 10 3 2 7 3 5 8 8 10255*/
0 0
- codeforces582C. Superior Periodic Subarrays
- Codeforces 582C Superior Periodic Subarrays
- Codeforces Round #323 (Div. 1) C. Superior Periodic Subarrays
- Beautiful Subarrays
- Superior Scheduler学习心得 原创
- superior drummer破解教程
- superior drummer 3破解教程
- codeforces665e Beautiful Subarrays(trie)
- LeetCode 53. Maximum Subarrays
- E. Beautiful Subarrays
- Two Subarrays Gym
- Periodic Strings
- Periodic Strings
- Periodic Strings
- Periodic Signal
- 【SPOJ-ARRAYSUB】subarrays【单调队列】
- CodeForces 665E Beautiful Subarrays
- CF665E Beautiful Subarrays字典树
- R12.1.3 应用克隆过程中autocfg脚本报错
- 日语五十音图
- 手机网站字号自适应
- jre运行报Picked up JAVA_TOOL_OPTIONS: -javaagent:/usr/share/java/jayatanaag.jar
- Python + Requests + Unittest接口自动化测试
- codeforces582C. Superior Periodic Subarrays
- UIViewController 中的 willMoveToParentViewController和didMoveToParentViewController的使用
- main()与_tmain()区别
- BZOJ1051[HAOI2006]受欢迎的牛
- Silverlight导出图片需要的几个类
- 南邮OJ 1015 最大公约数和最小公倍数
- 一个FTP任务
- 用JS获取地址栏参数的方法(超级简单)
- POJ 1789 Truck History (Prim)