#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
const int N=1e9+5,M = 1e5+5,MOD=1e9+7;
int n,m;
int f[M],s[M];
struct Node {
int l,r;
bool operator < (const Node& b)const {
return r<b.r;
}
} a[M];
int getl(int u) {
int l=0,r=m+1;
while(l<r) {
int mid=l+r+1>>1;
if(a[mid].r<u) {
l=mid;
} else {
r=mid-1;
}
}
return l;
}
int main(void) {
scanf("%d%d",&n,&m);
for(int i=2; i<=m+1; i++) {
scanf("%d%d",&a[i].l,&a[i].r);
}
sort(a+2,a+m+2);
f[1]=s[1]=1;
a[0]={-1,-1};
LL res=0;
for(int i=2; i<=m+1; i++) {
//第一个右边界小于a[i].l的药的序号
int l=getl(a[i].l);
//第一个右边界小于a[i].r的药的序号
int r=getl(a[i].r);
f[i]=(s[r]-s[l]+MOD)%MOD;
s[i]=(s[i-1]+f[i])%MOD;
if(a[i].r==n) {
res=(res+f[i])%MOD;
}
}
printf("%lld",res);
return 0;
}
- 首先,程序引入了两个库:
iostream
和algorithm
。iostream
库用于输入输出操作,algorithm
库包含了一系列算法。 - 接着,程序使用
using namespace std;
,使得在程序中可以直接使用标准库中的名称,而无需添加std::
前缀。 - 程序定义了一个长整型别名
LL
,以及三个常量N
、M
和MOD
。 - 定义了全局变量
n
和m
,以及两个数组f
和s
。 - 定义了一个结构体
Node
,表示一个节点,包含左边界和右边界两个属性。该结构体还定义了一个比较运算符<
,用于比较两个节点的右边界。 - 定义了一个名为
getl
的函数,该函数使用二分查找算法,根据给定的右边界值,在数组a
中找到第一个右边界小于给定值的节点的序号。 main
函数是程序的入口点。在main
函数中,首先通过输入读取了两个整数n
和m
。- 接着,程序通过循环读取输入,填充数组
a
。 - 使用标准库函数
sort
对数组a
进行排序。 - 初始化数组
f
和s
的第一个元素为1,同时设置一个虚拟节点a[0]
的左右边界为-1。 - 定义了一个变量
res
用于累加结果。 - 通过循环遍历数组
a
中的每个节点。对于每个节点,通过调用getl
函数找到第一个右边界小于节点左边界和右边界的节点的序号,然后利用这些序号在数组s
中找到对应的值,计算得到该节点的动态规划值,并更新数组f
和s
。如果节点的右边界等于给定的值n
,则将计算得到的动态规划值累加到结果变量res
中。 - 最后,程序输出结果变量
res
的值,并结束程序。
总结:该代码通过动态规划和二分查找等算法,求解某种特定问题。输入包括两个整数和两个数组,输出为一个长整型结果。