CodeForces #Pi C.Geometric Progression

题目大意:

求一个序列中形成以k为公比项数为3的等比数列的种类数。


解题思路:

考虑中间项b,统计b/k在前面出现的次数pre[b/k]和b*k在后面出现的次数suf[b*k],相乘。统计pre可以从前往后

扫,

统计suf则用all减去pre即可。

MAP的插入和查找复杂度都是logn,相当于一个下标无限大的数组,用来hash。


#include <cstring>
#include <cstdio>
#include <cmath>
#include <queue>
#include <map>
#include <set>
#define LL long long
#define MAX 2147483647
using namespace std;

set <int> s;
int n,k,a,m,b;

int max(int x,int y){
	if (x>y) return x;
	else return y;
}
int min(int x,int y){
	if (x<y) return x;
	else return y;
}
		
int main(){
	scanf("%d%d%d",&n,&k,&a);
	scanf("%d",&m);
	s.clear();
	int sum=(n+1)/(a+1);
	s.insert(0); s.insert(n+1);
	int ans=-1;
	bool flag=0;
	for (int i=1;i<=m;i++){
        scanf("%d",&b);
		set<int>::iterator it=s.upper_bound(b);
		int y=*it;
		int x=*(--it);
		sum-=(y-x)/(a+1)-(y-b)/(a+1)-(b-x)/(a+1);
		if (sum<k && !flag) ans=i, flag=1;
		s.insert(b);
	}
	printf("%d",ans);
	return 0;
}


你可能感兴趣的:(CodeForces #Pi C.Geometric Progression)