#include<bits/stdc++.h> using namespace std; const int maxn = 40001; int n,m,d[maxn],a[maxn],l,r,ans; vector<pair<int,int> > b; int main(){ cin>>n; for(int i=0;i<n;i++){ cin>>l>>r; a[m++]=l; a[m++]=r; b.push_back({l,r}); } sort(a,a+m); m=unique(a,a+m)-a-1; for(auto [l,r] : b){ l=lower_bound(a,a+m,l)-a; r=lower_bound(a,a+m,r)-a; d[l]++; d[r]--; } for(int i=1;i<m;i++){ d[i]+=d[i-1]; if(d[i]){ ans+=a[i+1]-a[i]; } } cout<<ans; }
时间: 2025-03-29 20:14:44 AIGC 浏览: 35
### C++ 中 `vector` 和 `lower_bound` 的功能解释
在 C++ 编程中,标准模板库(STL)提供了许多高效的容器和算法来简化开发过程。其中,`std::vector` 是一种动态数组容器,而 `std::lower_bound` 则是一种二分查找算法。
#### 动态数组 `std::vector`
`std::vector` 提供了一个可以自动调整大小的数组结构,支持随机访问操作,并允许在其末尾高效地添加或删除元素[^3]。以下是其主要特性:
- **动态扩展**:当向量容量不足时,它会分配更大的内存空间并将旧数据复制到新位置。
- **随机访问**:通过索引可以直接访问任意位置上的元素。
- **迭代器兼容性**:提供类似于指针的行为,能够与其他 STL 算法无缝协作。
```cpp
#include <vector>
std::vector<int> vec;
vec.push_back(10); // 向末尾追加元素
int value = vec[0]; // 随机访问第一个元素
```
#### 查找函数 `std::lower_bound`
`std::lower_bound` 实现了一种基于二分搜索的方法,在已排序序列中找到不小于给定值的第一个位置[^4]。如果目标范围未被预先排序,则该调用行为未定义。返回的是指向满足条件的位置的一个前向迭代器;如果没有这样的项目存在,则等于输入区间的末端。
下面是一个简单的例子展示如何利用这两个组件一起工作:
```cpp
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main(){
vector<int> numbers={1,2,3,5,7};
int key=4;
auto it = lower_bound(numbers.begin(),numbers.end(),key);
if(it != end(numbers)){
cout << "First element not less than "<<key<<" is at position "
<< distance(numbers.begin(),it)
<< ", its value is "<<*it<<endl;
}
else{
cout << "No elements found greater or equal to "<<key<< endl;
}
return 0;
}
```
上述程序片段展示了如何在一个整数型矢量上应用 `std::lower_bound` 来定位不低于指定键值的关键项。注意这里假设了原始集合已经按照升序排列好。
### 关于代码风格的选择
对于声明指针变量或者参数的时候,星号(*)放置在哪一侧并没有严格的技术限制,更多取决于团队编码规范和个人偏好[^2]。例如这两种写法都是完全合法有效的:
```cpp
char *pChar; // 星号靠近类型名
const string& refStr;// 参考运算符紧跟名称
// 或者也可以这样书写:
char* pCharAlt; // 星号紧挨着变量名字
const string &refStrAlt;// 运算符之间留有空白
```
无论采用哪种形式,保持一致性最为重要。
阅读全文
相关推荐




















