最小区间覆盖,当只有一次询问时就是一个贪心问题,按左区间排序,每次选择左端点在已经覆盖的点 + 1中,右端点能覆盖的最远的点;
当有m个询问时,考虑使用倍增的方式求解(类似于二分查找):
dp[i][j]表示从位置i起,选择2j个区间能到达的最远位置
如果在i这个位置取2j个能到>=r的地方,我们当然希望能找到一个小于等于2j个区间使得能够覆盖到r点,所以选取区间不断逼近r但不超过r,最后一次要检查一步能不能从当前l到r,故输出ans + 1
#include<bits/stdc++.h>
#pragma comment(linker, "/stack:200000000")
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#define debug(x) cout<<#x<<" is "<<x<<endl
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define DBG 0
const int N = 5e5 + 5;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const ll LLINF = (1LL<<60);
using namespace std;
const int mod = 998244353;
ll fast_pow(ll a,ll b){ll ans = 1;while(b){if(b&1)ans = (ans * a)%mod;a = (a * a)%mod;b>>=1;}return (ans%mod);}
inline ll read(){ll X=0; bool flag=1; char ch=getchar();while(ch<'0'||ch>'9') {if(ch=='-') flag=0; ch=getchar();}while(ch>='0'&&ch<='9') {X=(X<<1)+(X<<3)+ch-'0'; ch=getchar();}if(flag) return X;return ~(X-1);}
inline void write(ll X){if(X<0) {X=~(X-1); putchar('-');}if(X>9) write(X/10);putchar(X%10+'0');}
typedef pair<int,int> pii;
typedef vector<int> vi;
inline void fastIO(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);}
inline void time_cost(clock_t start_time,clock_t end_time){cout << "The run time is: " <<(double)(end_time - start_time) / CLOCKS_PER_SEC << "s" << endl;}
inline void init(){
}
int a[N];
int dp[N][25],n,m,maxr;
inline void solve(){
init();
scanf("%d%d",&n,&m);
for(int i = 1;i <= n;i++){
int l,r;
scanf("%d%d",&l,&r);
a[l] = max(a[l],r);
maxr = max(r,maxr);
}
for(int i = 0;i <= maxr;i++){
if(i > 0)
a[i] = max(a[i],a[i - 1]);
dp[i][0] = a[i];
}
for(int i = 1;i <= 20;i++)
for(int j = 0;j <= maxr;j++)
dp[j][i] = dp[dp[j][i - 1]][i - 1];
while(m--){
int l,r;
scanf("%d%d",&l,&r);
int ans = 0;
for(int i = 20;i >= 0;i--){
if(dp[l][i] < r){
ans += (1 << i);
l = dp[l][i];
}
}
if(a[l] >= r)
printf("%d\n",ans + 1);
else
printf("-1\n");
}
}
int main(){
#if DBG
freopen("input.txt","r",stdin);
freopen("output.txt","w",stdout);
#endif
solve();
return 0;
}