forked from chr4ss1/SPOJ
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPOSTERS.cpp
More file actions
118 lines (90 loc) · 2.16 KB
/
POSTERS.cpp
File metadata and controls
118 lines (90 loc) · 2.16 KB
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
112
113
114
115
116
117
118
// RELATED TO PROB
#define MAX_ELEMENTS 10000000
#define MAX_NODES 33554432
#define MAX_POSTERS 40000
int T, N;
bool NODES[MAX_NODES];
int POSTERS[MAX_POSTERS][2] = {0};
bool LAZY[MAX_NODES] = {0};
inline void propagate(int index, bool val)
{
LAZY[2*index] = val;
LAZY[2*index+1] = val;
}
inline void handle_lazy(int index, int low, int high)
{
if(LAZY[index]){
NODES[index] = true;
if(low != high)
propagate(index, true);
LAZY[index] = 0;
}
}
inline void combine(int index)
{
NODES[index] = NODES[2*index] && NODES[2*index+1];
}
int query(int index, int range1, int range2, int low, int high)
{
handle_lazy(index, low, high);
if(range1 > high || range2 < low) return -1;
if(low >= range1 && high <= range2) return NODES[index];
int mid = (low + high) >> 1;
int f1 = index << 1;
int f2 = f1 + 1;
int w = query(f1, range1, range2, low, mid);
int w1 = query(f2, range1, range2, mid+1, high);
if(w == -1) return w1;
if(w1 == -1) return w;
return w && w1;
}
void update(int index, int range1, int range2, int low, int high)
{
handle_lazy(index, low, high);
if(range1 > high || range2 < low) return;
if(low >= range1 && high <= range2){
NODES[index] = true;
if(low != high)
propagate(index, true);
return;
}
int mid = (low + high) >> 1;
int f1 = index << 1;
int f2 = f1 + 1;
update(f1, range1, range2, low, mid);
update(f2, range1, range2, mid+1, high);
combine(index);
}
int main()
{
parse_data();
T = extract_int();
while(T--){
N = extract_int();
int i = N;
int rBoundary = 0;
int lBoundary = -1;
while(i--){
POSTERS[i][0] = extract_int();
POSTERS[i][1] = extract_int();
if(lBoundary == -1)
lBoundary = POSTERS[i][0];
lBoundary = min(lBoundary, POSTERS[i][0]);
rBoundary = max(rBoundary, POSTERS[i][1]);
}
int t = (1 << (rBoundary - lBoundary + 1));
for(int w = 0; w < MAX_NODES; w++){
LAZY[w] = 0;
NODES[w] = 0;
}
int visible_posters = 0;
for(i = 0; i < N; i++){
if(!query(1, POSTERS[i][0], POSTERS[i][1], lBoundary, rBoundary)){
update(1, POSTERS[i][0], POSTERS[i][1], lBoundary, rBoundary);
visible_posters++;
}
}
printf("%d\n", visible_posters);
}
return 0;
}