Codeforces Round #825 (Div. 2) B,C

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]是否能进行匹配,一旦他们俩符合条件,中间的那些对儿不需要考虑,因为肯定没问题了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值