#include <cstdlib>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct Interval
{
int start;
int end;
Interval() : start(0), end(0)
{
}
Interval(int s, int e) : start(s), end(e)
{
}
};
bool compareInterval(Interval i1, Interval i2)
{
return (i1.start < i2.start);
}
vector<Interval> merge_intervals(vector<Interval> &intervals)
{
vector<Interval> result_set;
if (intervals.empty())
return result_set;
sort(intervals.begin(), intervals.end(), compareInterval);
result_set.push_back(intervals[0]);
for (int i = 1; i < intervals.size(); i++)
{
if (result_set.back().end < intervals[i].start)
result_set.push_back(intervals[i]);
else
result_set.back().end = max(result_set.back().end, intervals[i].end);
}
return result_set;
}
vector<Interval> intersectIntervals(vector<Interval> &arr1, vector<Interval> &arr2)
{
vector<Interval> result_set;
int i = 0, j = 0;
int n = arr1.size(), m = arr2.size();
while (i < n && j < m) {
int l = max(arr1[i].start, arr2[j].start);
int r = min(arr1[i].end, arr2[j].end);
if (l <= r)
result_set.push_back(Interval(l, r));
if (arr1[i].end < arr2[j].end)
i++;
else
j++;
}
return result_set;
}
int main()
{
vector<Interval> zolty,czerwony, niebieski;
int n, m;
cin >> n >> m;
std::vector<int> puszki(n+1);
int rV = 0;
int l, r, k;
for (int mi = 0; mi < m; mi++)
{
cin >> l >> r >> k;
if (k == 1)
zolty.push_back(Interval(l, r));
if (k == 2)
niebieski.push_back(Interval(l, r));
if (k == 3)
czerwony.push_back(Interval(l, r));
}
zolty = merge_intervals(zolty);
niebieski = merge_intervals(niebieski);
czerwony = merge_intervals(czerwony);
vector<Interval> zielony = intersectIntervals(zolty, niebieski);
for (int i = 0; i < czerwony.size(); i++)
for (int p = czerwony[i].start; p <= czerwony[i].end; p++)
puszki[p]=100;
for (int i = 0; i < zielony.size(); i++)
for (int p = zielony[i].start; p <= zielony[i].end; p++)
if (puszki[p] != 100)
rV++;
cout << rV << endl;
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | #include <cstdlib> #include <iostream> #include <vector> #include <algorithm> using namespace std; struct Interval { int start; int end; Interval() : start(0), end(0) { } Interval(int s, int e) : start(s), end(e) { } }; bool compareInterval(Interval i1, Interval i2) { return (i1.start < i2.start); } vector<Interval> merge_intervals(vector<Interval> &intervals) { vector<Interval> result_set; if (intervals.empty()) return result_set; sort(intervals.begin(), intervals.end(), compareInterval); result_set.push_back(intervals[0]); for (int i = 1; i < intervals.size(); i++) { if (result_set.back().end < intervals[i].start) result_set.push_back(intervals[i]); else result_set.back().end = max(result_set.back().end, intervals[i].end); } return result_set; } vector<Interval> intersectIntervals(vector<Interval> &arr1, vector<Interval> &arr2) { vector<Interval> result_set; int i = 0, j = 0; int n = arr1.size(), m = arr2.size(); while (i < n && j < m) { int l = max(arr1[i].start, arr2[j].start); int r = min(arr1[i].end, arr2[j].end); if (l <= r) result_set.push_back(Interval(l, r)); if (arr1[i].end < arr2[j].end) i++; else j++; } return result_set; } int main() { vector<Interval> zolty,czerwony, niebieski; int n, m; cin >> n >> m; std::vector<int> puszki(n+1); int rV = 0; int l, r, k; for (int mi = 0; mi < m; mi++) { cin >> l >> r >> k; if (k == 1) zolty.push_back(Interval(l, r)); if (k == 2) niebieski.push_back(Interval(l, r)); if (k == 3) czerwony.push_back(Interval(l, r)); } zolty = merge_intervals(zolty); niebieski = merge_intervals(niebieski); czerwony = merge_intervals(czerwony); vector<Interval> zielony = intersectIntervals(zolty, niebieski); for (int i = 0; i < czerwony.size(); i++) for (int p = czerwony[i].start; p <= czerwony[i].end; p++) puszki[p]=100; for (int i = 0; i < zielony.size(); i++) for (int p = zielony[i].start; p <= zielony[i].end; p++) if (puszki[p] != 100) rV++; cout << rV << endl; return 0; } |
English