题目大意:
给定一个区间,每次除去一个点,要求在剩下的空白里能放下k个长为a的区间。
解题思路:
直接用set保存当前分割的区间就可以了。总复杂度为n * logn
#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;
}