1
一个想法,不知道对不对,就是这个翻译有些细小的偏差
令每张照片的可以拍摄开区间为
首先可以想到各种一眼就是错的贪心。
假设现在有
然后现在从左往右扫,考虑怎么求出
假如直接贪心把
因此,由于问题也只是求是否有解且
一般化的,对于一个指标集
可以发现,如果存在一组合法方案
然后继续考虑贪心:记所有禁止区间的并集为
证明可以考虑归纳。。
但是这样子禁止区间高达
令
如果存在
所以事实上
考虑按照左端点排序,假设
依次对
根据前面从左往右的贪心,此时从右往左同样也是对的,答案就是最大的左端点
但是这样会出现当前位置不在禁止区间内,但是也没有区间可以匹配。此时可以将这整个问题分成两个更小的子问题,如果出现不可分割的子问题,可以发现一定不存在这种情况。
因此考虑对每一对
因此
然后考虑从
具体,先令
判断无解时,就是看
时间复杂度
#include<bits/stdc++.h>
#define R(i,a,b) for(int i=(a),i##E=(b);i<=i##E;i++)
#define L(i,a,b) for(int i=(b),i##E=(a);i>=i##E;i--)
using namespace std;
int n,t;
pair<int,int>a[11111];
int rr[11111],to[11111],now[11111];
int dp[11111];
inline int ckmin(int &x,const int y)
{
return x>y?x=y,1:0;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cin>>n>>t;
R(i,1,n)
{
cin>>a[i].first>>a[i].second;
rr[i]=a[i].second;
}
R(i,1,n) now[i]=n;
sort(a+1,a+n+1),sort(rr+1,rr+n+1);
R(i,1,n) dp[i]=rr[i],to[i]=1<<30;
L(i,1,n)
{
int r=n;
for(;rr[r]>=a[i].second;--r)
{
dp[r]-=t;
for(;i<now[r]&&dp[r]<a[now[r]].first;--now[r]) ckmin(dp[r],to[now[r]]);
if(dp[r]<a[i].first) return cout<<"no"<<endl,0;
ckmin(to[i],dp[r]-t);
}
}
cout<<"yes"<<endl;
}