CodeForces #Pi D.One-Dimensional Battle Ships

题目大意:

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


你可能感兴趣的:(CodeForces #Pi D.One-Dimensional Battle Ships)