题目大意:
给定一个区间,每次除去一个点,要求在剩下的空白里能放下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; }