codeforces582C. Superior Periodic Subarrays

2024-04-02 10:38

本文主要是介绍codeforces582C. Superior Periodic Subarrays,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

传送门: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;
}
/*
180
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 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
*/



这篇关于codeforces582C. Superior Periodic Subarrays的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/869760

相关文章

imx6ull Enhanced Periodic Interrupt Timer (EPIT)

一、overview EPIT是一个32位的计时器,能够在处理器很少干预的情况下以固定的时间间隔提供精确的中断。软件使能后,EPIT就开始计数。IMX6ULL有2个EPIT定时器。其框图如下所示: 1.1 epit 特性 EPIT具有以下主要特性: •可选择时钟源的32位递减计数器 •12位预分频器,用于对输入时钟进行分频 •可即时编程的计数器值 •可以设置在低功耗和调试模式下,计数器仍

AtCoder Beginner Contest 310 B题 Strictly Superior

B题:Strictly Superior 标签:枚举、模拟题意:给定 n n n个产品,第 i i i个产品 p i p_i pi​元,且有 c i c_i ci​个功能 f i , k f_{i,k} fi,k​( 1 < = k < = c i 1<=k<=c_i 1<=k<=ci​)。题目求有没有以下所以条件的情况出现( 1 < = i , j < = n 1<=i,j<=n 1<=i,j

Leetcode 3137. Minimum Number of Operations to Make Word K-Periodic

Leetcode 3137. Minimum Number of Operations to Make Word K-Periodic 1. 解题思路2. 代码实现 题目链接:3137. Minimum Number of Operations to Make Word K-Periodic 1. 解题思路 这一题的话我们只需要将原始的字符串按照k个字母为一组进行分组,然后看各自出现的频次即

An internal error occurred during: Periodic workspace save.. Java heap space

myeclipse从svn导入新项目是老是报错: An internal error occurred during: "Periodic workspace save.". Java heap space 意思是说:一个内部错误发生,myeclipse内存不够,堆内存不够,同时myeclipse提示: 解决方法: MyEclipse已经检测到小于5%的堆内存空间保留的494m

Codeforces 1631 B. Fun with Even Subarrays —— 贪心

This way 题意: 给你一个长度为n的数组a,你每次可以选择一个长度为2k的连续区间(k不定),将后k个数一一对应赋值给前k个数,问你最终要使得a中所有元素相等,需要至少多少次操作。 题解: 想错了…我以为是前赋值后或者后赋值前,这样情况就比较复杂了,暂时想到的方法是区间DP,还有一些奇奇怪怪的DP。但是2e5的范围不能接受,以后再想想怎么做,或许也会凭此出一道题目。 既然是后赋值

UVa 455 周期串 (Periodic Strings)

题目意思:             如果一个字符串可以由某个长度为k的字符串重复多次得到,则称该串以k为周期。例如,abcabcabcabc以3为周期(注意6,12也为周期 ),求的是最小周期。 实现: #include<stdio.h>#include<string.h>#define maxn 100000int main(){char s[maxn];int n, i;

Leetcode 3101. Count Alternating Subarrays

Leetcode 3101. Count Alternating Subarrays 1. 解题思路2. 代码实现 题目链接:3101. Count Alternating Subarrays 1. 解题思路 这一题我们只需要用贪婪算法对原数组进行切分,使得每一段都是最大的交错子序列,然后,我们要获得所有交错子序列的个数,就只需要在每一段上进行 C n + 1 2 C_{n+1}^2 Cn+

Codeforces Round 841 (Div. 2) C. Even Subarrays

题目 思路: #include <bits/stdc++.h>using namespace std;#define int long long#define pb push_back#define fi first#define se second#define lson p << 1#define rson p << 1 | 1const int maxn =

Leetcode 3036. Number of Subarrays That Match a Pattern II

Leetcode 3036. Number of Subarrays That Match a Pattern II 1. 解题思路2. 代码实现 3036. Number of Subarrays That Match a Pattern II 1. 解题思路 这一题其实有点水,因为本质上还是一道套路题目,和前两周的两道题目一样,都是考察的z算法: Leetcode 3031. Mini

Educational Codeforces Round 145 (Rated for Div. 2)C. Sum on Subarrays(构造)

很意思的一道构造题 题意:给一个 n 、 k n、k n、k,让构造长度为n的数组满足,子数组为整数的个数为k个,负数的为 k − ( n + 1 ) ∗ n / 2 k-(n+1)* n/2 k−(n+1)∗n/2,每个数的范围为 [ − 1000 , 1000 ] [-1000,1000] [−1000,1000] 这种构造题可以考虑就是前一段可以一直用一样的、最小的。 我们观察可以发现