转自https://blog.csdn.net/libin66/article/details/52132641
给定n个线段[l,r],问哪些区间正好被线段覆盖了k次。输出这样的区间个数,以及区间
进去一个区间(扫描到L) num++,退出时 (扫描到R)num--;
令num=0
如果有三个区间覆盖
则一直扫描了3个L ,num加了三次,则num的数量就是当前覆盖区间的数量
同时出去时num--来减少覆盖区间数量
pair正好能够记录区间端点并且用1 ,-1 记录左右,同时sort pair 默认是按照first,其次是second
typedef pair<int, int> P;
vector<P> v;
v.push_back(make_pair(l, 0));
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
typedef pair<int, int> P;
int main() {
int n, k;
scanf("%d %d", &n, &k);
int l, r;
vector<P> v;
int i;
for(i = 0; i < n; i++) {
scanf("%d %d", &l, &r);
v.push_back(make_pair(l, -1)); //注意0 1的分配,由小到大排序
v.push_back(make_pair(r, 1));
}
sort(v.begin(), v.end());
int cnt = 0;
vector<int> ans;
for(i = 0; i < v.size(); i++) {
if(v[i].second == -1) {
cnt++; //注意判断的顺序
if(cnt == k) ans.push_back(v[i].first);
}
else {
if(cnt == k) ans.push_back(v[i].first);
cnt--;
}
}
printf("%d\n", ans.size() / 2);
for(i = 0; i < ans.size() / 2; i++) {
printf("%d %d\n", ans[2 * i], ans[2 * i + 1]);//为什么肯定这个区间端点在2*i 和2*i+1 因为退出的第一个肯定是和之前放进ans里面的相配对,而且是先判定再cnt--
}
return 0;
}
第二题
http://codeforces.com/problemset/problem/1000/C
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long ll;
typedef pair<ll, int> P;
ll ary[200005];
int main() {
int n, k;
scanf("%d", &n);
ll l, r;
vector<P> v;
int i;
for(i = 0; i < n; i++) {
scanf("%I64d %I64d", &l, &r);
v.push_back(make_pair(l, -1)); //注意-1 1的分配,由小到大排序 排序先是first之后是second
v.push_back(make_pair(r, 1));
}
sort(v.begin(), v.end());
ll cnt = 0;
ll temp;
vector<ll> ans;
ans.push_back(0);
for(i = 0; i < v.size(); i++) {
// cout<<v[i].first<<" "<<v[i].second<<endl;
if(v[i].second == -1) {
cnt++; //注意判断的顺序
ans.push_back(v[i].first);
}
else {
temp=ans[ans.size()-1];
ary[cnt]+=v[i].first-temp+1;
ans.pop_back();
cnt--;
}
}
ll sum=0;
for(int i=n;i>0;i--)
{
ary[i]-=sum; //按照上面的算,覆盖了1次的ary[1]其实也计算上了ary[2]ary[3]....所以要减去!!
sum+=ary[i];
}
for(int i=1;i<=n;i++)
{
printf("%I64d ",ary[i]);
}
printf("\n");
return 0;
}