11992: 【原1992】绮礼的阴谋
题目
题目描述
author: Weihao Kong 原OJ链接:https://acm.sjtu.edu.cn/OnlineJudge-old/problem/1992
题目描述
第四次圣杯战争开始了。 为了收集敌人的情报,言峰绮礼命令他的使魔Assassin将自己的灵体分成\(n\)份,分别监视教堂外的长直走道。
Assassin每份灵体的能力不同。 第\(i\)份灵体可以监视到的区域是闭区间\([a_i,b_i]\)。
绮礼想知道,监控范围内的区域的总长度是多少。
比如,第一份灵体的视野是\([-1,1]\),第二份灵体的视野是\([0,2]\),第三份灵体的视野是\([3,4]\)。 那么绮礼能获得的全部视野是\([-1,2]\cup[3,4]\),长度为\(4\)。
输入格式
第\(1\)行有一个整数,表示灵体数量\(n\)。 接下来有\(n\)行,每行两个整数\(a_i\)和\(b_i\),表示第\(i\)个灵体的视野为\([a_i,b_i]\)。
输出格式
输出一个整数\(s\),表示获得的全部视野的总长度。
样例输入
3
3959 21659
8666 26551
3392 11450
样例输入
23159
样例解释
\( [3959,21659]\cup[8666,26551]\cup[3392,11450] = [3392,26551] \)
总长度为 \( 26551-3392 = 23159 \)
说明
时间限制:1000ms,内存限制:50000kb。
对于全部数据:灵体数量\(1 \leq n \leq 10000\)。 每份灵体的视野 \(1 \leq a_i ,b_i\leq 2 \times 10^9\)
对于30%数据: 灵体数量\(1 \leq n \leq 50\)。
BugenZhao's solution
//
// Created by BugenZhao on 2019/3/23.
//
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
using ll=long long;
/*class Interval {
public :
int l;
int r;
bool operator<(const Interval &rhs) const {
if (l < rhs.l)
return true;
if (rhs.l < l)
return false;
return r < rhs.r;
}
};*/
int main() {
int starts[10005], ends[10005];
int n;
cin >> n;
for (int i = 0; i < n; ++i) {
scanf("%d%d", &starts[i], &ends[i]);
}
sort(starts, starts + n);
sort(ends, ends + n);
int length = 0;
int i = 0, j = 0;
for (; i < n; ++i) {
if (i == n - 1 || starts[i + 1] > ends[i]) {
length += ends[i] - starts[j];
j = i + 1;
}
}
cout << length << endl;
return 0;
}
FineArtz's solution
/* 绮礼的阴谋 */
#include <iostream>
#include <algorithm>
using namespace std;
class Interval{
public:
//constructor
Interval() : l(0), r(0) {}
Interval(int x, int y) : l(x), r(y) {}
Interval(const Interval &i) : l(i.l), r(i.r) {}
int l, r;
};
inline bool cmp(Interval i1, Interval i2){
return (i1.l < i2.l || i1.l == i2.l && i1.r > i2.r);
}
int main(){
int n;
cin >> n;
Interval a[10005];
for (int i = 0; i < n; ++i)
cin >> a[i].l >> a[i].r;
sort(a, a + n, cmp);
/*for (int i = 0; i < n; ++i)
cout << a[i].l << ' ' << a[i].r << endl;*/
long long nowl = a[0].l, nowr = a[0].r;
long long ans = 0;
for (int i = 1; i < n; ++i){
if (nowl <= a[i].l && a[i].l <= nowr){
if (nowr < a[i].r) nowr = a[i].r;
}
else{
ans += nowr - nowl;
nowl = a[i].l;
nowr = a[i].r;
}
}
ans += nowr - nowl;
cout << ans << endl;
return 0;
}
ligongzzz's solution
#include "iostream"
#include "cstdio"
using namespace std;
int times[10009][2] = { 0 };
template <class T>
void quick_sort(T start, T end) {
if (start == end)
return;
auto i = start, j = end;
--j;
if (i == j)
return;
//交换
auto key = (*start)[0];
auto tmp = (*start)[1];
for (bool status = true; i != j;) {
if (status) {
if ((*j)[0] < key) {
(*i)[0] = (*j)[0];
(*i)[1] = (*j)[1];
++i;
status = false;
}
else
--j;
}
else {
if ((*i)[0] > key) {
(*j)[0] = (*i)[0];
(*j)[1] = (*i)[1];
--j;
status = true;
}
else
++i;
}
}
(*i)[1] = tmp;
(*i)[0] = key;
//递归
quick_sort(start, i + 1);
quick_sort(i + 1, end);
}
int main() {
int n;
cin >> n;
for (int i = 0; i < n; ++i) {
scanf("%d %d", ×[i][0], ×[i][1]);
}
quick_sort(times, times + n);
int ans = 0;
int cur_left = 0, cur_right = 0;
for (int i = 0; i < n; ++i) {
if (times[i][0] > cur_right) {
ans += cur_right - cur_left;
cur_left = times[i][0];
cur_right = times[i][1];
}
else {
if (cur_right < times[i][1])
cur_right = times[i][1];
}
}
ans += cur_right - cur_left;
cout << ans;
return 0;
}
skyzh's solution
#include <iostream>
#include <algorithm>
using namespace std;
struct Range {
int L, R;
} R[10000];
bool cmp(const Range& a, const Range& b) {
return a.L <= b.L;
}
int main() {
long long SUM = 0;
int N;
cin >> N;
for (int i = 0; i < N; i++) cin >> R[i].L >> R[i].R;
sort(R, R + N, cmp);
int LS = R[0].L, LE = R[0].R;
for (int i = 1; i < N; i++) {
if (R[i].L > LE) {
SUM += (long long) LE - LS;
LE = R[i].R;
LS = R[i].L;
} else if (R[i].R > LE) {
LE = R[i].R;
}
}
SUM += (long long) LE - LS;
cout << SUM << endl;
return 0;
}
yyong119's solution
#include <iostream>
#include <cstdio>
#include <algorithm>
#define MAX_N 10010
using namespace std;
struct node{
int l, r;
} a[MAX_N];
int n, cnt;
inline bool cmp(node p, node q) {
return p.l < q.l;
}
int main() {
scanf("%d", &n);
for (int i = 0; i < n; ++i)
scanf("%d%d", &a[i].l, &a[i].r);
sort(a, a + n, cmp);
int upd = 0, cur_l = a[0].l, cur_r = a[0].r;
for (int i = 1; i < n; ++i) {
if (a[i].r <= cur_r) continue;
if (a[i].l > cur_r) {
cnt += cur_r - cur_l;
cur_l = a[i].l;
}
cur_r = a[i].r;
}
cnt += cur_r - cur_l;
printf("%d\n", cnt);
return 0;
}