Playing with GCD
题目大意是给出一个序列a,问是否能构造一个序列B
使得任意__gcd(b[i],b[i+1])=a[i]
这个题在写的时候我有很多的误区,具体误区写在上一篇文章里了
这个题的做法先令 b[1]=a[1],b[n+1]=a[n]
然后再让 b[i]=lcm(a[i],a[i-1]),最后在整体验算一遍,是否符合gcd(b[i],b[i+1])=a[i],全都符合则说明可以,输出YES
C - Good Subarrays (Easy Version)
题目大意:给出一个序列A,在序列A中如果一个区间在单独拿出来之后(下标改变)可以变成一个满足任意 a[i]>=i的数组 。统计这样区间的数量。
凡是涉及求区间个数,并且n还不小的这种情况(没法直白的暴力)首先考虑双指针的写法:
常见的双指针都是先固定一个指针,然后枚举另一个指针.一般第一个指针表示区间左端点,第二个指针表示区间右端点,然后第二个指针在枚举的时候会有break的过程!,而且第二个指针的起始位置不受第一个指针的影响,两个指针的位置是独立的
#include<bits/stdc++.h>
using namespace std;
int a[200001];
int main() {
int t;
cin>>t;
while(t--) {
int n;
cin>>n;
for(int i=1; i<=n; i++) {
cin>>a[i];
}
long long sum=0;
for(int i=1,j=1;i<=n;i++)
{
while(a[j]>=j-i+1&&j<=n)
{
j++;
}
sum+=(j-i);
}
cout<<sum<<endl;
}
}
分析:如果 a[j]可以与a[i]进行匹配,那么就说明a[j]可以和 a[i+1]…a[i+2]…a[i+3]…a[j]都进行匹配,远处的都能匹配了,近处的肯定更没问题了,在一旦出现一组不匹配的情况时,开始判断a[j+1]和a[i+1]是否能进行匹配,一旦他们俩符合条件,中间的那些对儿不需要考虑,因为肯定没问题了