第一行输入两个整数
,用空格隔开,表示马路的长度和地铁施工区域数,满足
,
。
接下来
行,每行输入两个整数
,用空格隔开,表示第
个施工区域的起始点和终止点的坐标,满足
。
输出一个整数,表示移除所有施工区域内(包括端点)树后,剩余的树的总棵树数。
500 3 150 300 100 200 470 471
298
马路上共有棵树。施工区域 [150,300] 中含有
棵,[100,200] 中含有
棵,[470,471] 中含有
棵。三个区域的重叠部分 [150,200] 有
棵被重复移除,所以实际移除的树数为
,因此剩余
棵。
10 2 2 5 4 8
4
马路上共有棵树。区域 [2,5] 移除
棵,区域 [4,8] 移除
棵。重叠部分 [4,5] 有
棵被重复移除,所以实际移除
棵,剩余
棵。
l,m = map(int,input().strip().split()) regin = [] for _ in range(m): a,b = map(int,input().strip().split()) regin.append((a,b)) totals = l +1 remove_trees = overlaps = 0 removed = [False] * (l+1) for (a,b) in regin: for i in range(a,b+1): if not removed[i]: remove_trees += 1 removed[i] = True else: overlaps += 1 remain = totals - remove_trees print(remain)
l, m = map(int, input().split(" "))
node_lst = []
flag = 0
cnt = 0
for i in range(0, m):
x, y = map(int, input().split(" "))
node_lst.append([x, 1])
node_lst.append([y, -1])
node_lst.sort()
start_node = node_lst[0][0]
for j in range(0, len(node_lst)):
flag = flag + node_lst[j][1]
if flag == 0:
end_node = node_lst[j][0]
yc_cnt = end_node - start_node + 1
cnt += yc_cnt
if j + 1 < len(node_lst):
start_node = node_lst[j + 1][0]
print(l - cnt + 1)
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;
class ComparePair {
public:
bool operator()(const pair<int, int>& a, const pair<int, int>& b) const {
return a.first < b.first;
}
};
int main() {
int L, M;
cin >> L >> M;
vector<pair<int, int>> intervals;
intervals.reserve(M);
for (int i = 0; i < M; ++i) {
int x, y;
cin >> x >> y;
intervals.emplace_back(x, y);
}
sort(intervals.begin(), intervals.end(), ComparePair());
vector<pair<int, int>> merged_intervals;
if (!intervals.empty()) {
auto it = intervals.begin();
int cur_start = it->first;
int cur_end = it->second;
for (++it; it != intervals.end(); ++it) {
if (it->first <= cur_end + 1) {
cur_end = max(cur_end, it->second);
} else {
merged_intervals.emplace_back(cur_start, cur_end);
cur_start = it->first;
cur_end = it->second;
}
}
merged_intervals.emplace_back(cur_start, cur_end);
}
int covered_count = 0;
for (const auto& seg :
merged_intervals) {
covered_count += seg.second - seg.first + 1;
}
cout << (L + 1 - covered_count) << endl;
return 0;
} 这是我的答案,虽然跟使一样但是我觉得很好理解也很直接
#include <stdio.h>
int main() {
int L,M;
scanf("%d %d",&L,&M);
int tree[20000]={0};
for(int i=0;i<=L;i++){
tree[i]=1;
}
int l[M];
int r[M];
for(int i=0;i<M;i++){
scanf("%d %d",&l[i],&r[i]);
}
for(int i=0;i<M;i++){
for(int j=l[i];j<=r[i];j++){
tree[j]=-1;
}
}
int cnt=0;
for(int i=0;i<=L;i++){
if(tree[i]==1){
cnt++;
}
// printf("%d.%d ",i,tree[i]);
}
printf("%d",cnt);
return 0;
} #include <iostream>
using namespace std;
#include<vector>
int main() {
int L,M;
cin>>L>>M;
vector<int>v;
v.resize(L+1);
for(int i=0;i<v.size();i++){
v[i]=0;
}
while(M--){
int l,r;
cin>>l>>r;
for(int i=l;i<=r;i++){
if(v[i]==0){
v[i]=1;
}
}
}
int sum=0;
for(int i=0;i<v.size();i++){
if(v[i]==0){
sum++;
}
}
cout<<sum;
} import sys datas = [line.strip().split() for line in sys.stdin] L,M = map(int,datas[0]) arr = set() for data in datas[1:]: l,r = map(int,data) arr.update(list(range(l,r+1))) print(L+1-len(arr))
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
int L = in.nextInt(), M = in.nextInt();
StringBuffer sb = new StringBuffer();
sb.setLength(L+1);
for (int n=0; n<M; n++) {
int l = in.nextInt(), r = in.nextInt();
for (int t=l; t<=r; t++) {
sb.setCharAt(t, '0');
}
}
System.out.println(sb.toString().replaceAll("0", "").length());
}
} 依旧StringBuffer