-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmulticoursetime.cpp
111 lines (104 loc) · 3.05 KB
/
multicoursetime.cpp
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
106
107
108
109
110
111
#include "multicoursetime.h"
namespace CourseSystem
{
multiCourseTime::multiCourseTime(const vector<ClassPeriod> &cps)
{
for (auto cp : cps)
{
push_back(CourseTime(cp));
}
}
void multiCourseTime::push_back(const CourseTime &course_time)
{
course_times.push_back(course_time);
}
void multiCourseTime::erase(const CourseTime &course_time)
{
auto it = course_times.begin();
for(it; it != course_times.end(); ++it)
{
if((*it) == course_time)
break;
}
if(it != course_times.end())
course_times.erase(it);
}
void multiCourseTime::debug()
{
{
for(auto tm : course_times)
tm.debug();
}
}
bool judge_conflict(const multiCourseTime &course_time_1, const multiCourseTime &course_time_2)
{
SegmentTree tree(MAX_CLASS_ID);
for (const auto &time : course_time_1.course_times)
{
tree.change(1, 1, MAX_CLASS_ID, time.get_start_class_id(), time.get_end_class_id(), time.reverse);
}
for (const auto &time : course_time_2.course_times)
{
if (tree.query(1, 1, MAX_CLASS_ID, time.get_start_class_id(), time.get_end_class_id()) != 0)
return false;
}
return true;
}
bool operator^(const multiCourseTime &course_time_1, const multiCourseTime &course_time_2)
{
return judge_conflict(course_time_1, course_time_2);
}
multiCourseTime operator+(const multiCourseTime &course_time_1, const multiCourseTime &course_time_2)
{
auto res = course_time_1;
for(auto it : course_time_2.course_times)
{
bool find = 0;
for(int i = 0; i < res.course_times.size(); ++i)
{
if(res.course_times[i] == it)
{
find = 1;
res.course_times[i].reverse += it.reverse;
}
}
if(!find)
{
res.push_back(it);
}
}
return res;
}
multiCourseTime operator-(const multiCourseTime &course_time_1, const multiCourseTime &course_time_2)
{
auto res = course_time_1;
for(auto it : course_time_2.course_times)
{
bool find = 0;
for(int i = 0; i < res.course_times.size(); ++i)
{
if(res.course_times[i] == it)
{
find = 1;
res.course_times[i].reverse -= it.reverse;
}
}
if(!find)
{
auto tmp = it;
tmp.reverse = -tmp.reverse;
res.push_back(tmp);
}
}
return res;
}
multiCourseTime operator~(const multiCourseTime &course_time)
{
auto res = course_time;
for(auto& it : res.course_times)
{
it.reverse = -it.reverse;
}
return res;
}
} // namespace CourseSystem