题目大意:
求一个序列中形成以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;
}