EOJ 2458 Frequent values
1
/**/
/*
2
EOJ 2458 Frequent values
3![]()
4![]()
5
----问题描述:
6![]()
7
You are given a sequence of n integers a1 , a2 ,
, an in non-decreasing order.
8
In addition to that, you are given several queries consisting of indices i and j (1 ≤ i ≤ j ≤ n).
9
For each query, determine the most frequent value among the integers ai ,
, aj.
10![]()
11![]()
12
----输入:
13![]()
14
The input consists of several test cases.
15
Each test case starts with a line containing two integers n and q (1 ≤ n, q ≤ 100000).
16
The next line contains n integers a1 ,
, an (-100000 ≤ ai ≤ 100000, for each i ∈ {1,
, n}) separated by spaces.
17
You can assume that for each i ∈ {1,
, n-1}: ai ≤ ai+1.
18
The following q lines contain one query each, consisting of two integers i and j (1 ≤ i ≤ j ≤ n),
19
which indicate the boundary indices for the query.
20
21
The last test case is followed by a line containing a single 0.
22![]()
23![]()
24
----输出:
25![]()
26
For each query, print one line with one integer:
27
The number of occurrences of the most frequent value within the given range.
28![]()
29![]()
30
----样例输入:
31![]()
32
10 3
33
-1 -1 1 1 1 1 3 10 10 10
34
2 3
35
1 10
36
5 10
37
0
38![]()
39![]()
40
----样例输出:
41![]()
42
1
43
4
44
3
45![]()
46![]()
47
----分析:
48![]()
49
方案一,
50
线段树,树中结点保存
51
左端,右端,最频 的实际数值;
52
左端,右端,最频 的数值的频度;
53
左右端点。
54![]()
55
方案二,
56
RMQ ST 算法。
57![]()
58
*/
59![]()
60![]()
61![]()
62![]()
/**/
/**********************************************
63
版本二:
64
AC 1019MS
65
RMQ ST 算法。
66
*/
67![]()
68![]()
69
#include
<
iostream
>
70
#include
<
cstdio
>
71
#include
<
cmath
>
72
#include
<
algorithm
>
73![]()
74
using
namespace
std;
75![]()
76
const
int
L
=
100009
;
77![]()
78
template
<
class
T
=
int
, unsigned
int
L
=
100009
, unsigned
int
L2
=
18
>
79
class
RmqSt
80![]()
{
81
public :
82![]()
int init( T a[], int le, int ri)
{
83
int i, j, k;
84![]()
85
fr[ le ] = le;
86![]()
for ( i = le+1; i < ri; ++i )
{
87![]()
if ( a[ i ] == a[ i - 1 ] )
{
88
fr[ i ] = fr[ i - 1 ];
89
}
90![]()
else
{
91
fr[ i ] = i;
92
}
93
}
94![]()
95
la[ ri-1 ] = ri;
96![]()
for ( i = ri-1; i > le; --i )
{
97![]()
if ( a[ i ] == a[ i - 1 ] )
{
98
la[ i - 1 ] = la[ i ];
99
}
100![]()
else
{
101
la[ i - 1 ] = i;
102
}
103
}
104![]()
105![]()
for ( i = le; i < ri; ++i )
{
106
f[ i ][ 0 ] = 1;
107
}
108
k = 1;
109![]()
while ( (1 << k) <= ri - le )
{
110![]()
for ( i = ri - (1<<k); i >= le; --i )
{
111
j = i + (1<<(k-1));
112
f[ i ][ k ] = max(f[i][k-1], f[j][k-1]);
113![]()
if ( a[ j ] == a[ j - 1 ] )
{
114
f[ i ][ k ] = max(f[i][k], min(la[j], i+(1<<k)) - max(fr[j], i));
115
}
116
}
117
++k;
118
}
119
return 0;
120
}
121![]()
int query(int le, int ri)
{
122
int k = (int)(floor(log(((double)(ri)) - le) / log(2.0)));
123
int j = ri - (1<<k);
124
int q = max(f[le][k], f[j][k]);
125![]()
if ( (le < j) && (a[j] == a[j-1]) )
{
126
q = max(q, min(la[j], ri) - max(fr[j], le));
127
}
128
j = le + (1<<k);
129![]()
if ( (j < ri) && (a[j] == a[j-1]))
{
130
q = max(q, min(la[j], ri) - max(fr[j], le));
131
}
132
return q;
133
}
134![]()
135
private :
136
T f[ L ][ L2 ];
137
int fr[ L ], la[ L ]; // fr[i] 表示 a[i] 第一次出现的位置,la 类似,表最后
138
}
;
139![]()
140
RmqSt
<
int
>
prob;
141
int
a[ L ];
142
int
n;
143![]()
144![]()
int
main()
{
145
int i, q, le, ri;
146![]()
while ( (1 == scanf("%d", &n)) && (0 < n) )
{
147
scanf("%d", &q);
148![]()
for ( i = 1; i <= n; ++i )
{
149
scanf("%d", a+i);
150
}
151
prob.init(a, 1, n+1);
152![]()
while ( q-- > 0 )
{
153
scanf("%d%d", &le, &ri);
154
printf("%d\n", prob.query(le, ri+1));
155
}
156
}
157
return 0;
158
}
159![]()
160![]()
161![]()
162![]()
/**/
/**********************************************
163
版本一:
164
AC 941 MS
165
线段树。
166
*/
167![]()
/**/
/*
168
#include <iostream>
169
#include <cstdio>
170
#include <algorithm>
171![]()
172
using namespace std;
173![]()
174
const int L = 100009;
175![]()
176
template<class T = int, unsigned int L = 100009>
177
class SegTree
178
{
179
public :
180
int init(T a[], int le, int ri) {
181
this->a = a;
182
return this->init(1, le, ri);
183
}
184
int query(int le, int ri) {
185
this->le = le;
186
this->ri = ri;
187
Node qr;
188
return this->query(1, qr);
189
}
190![]()
191
private :
192
struct Node
193
{
194
T lv, rv, mv; // 左端,右端,最频 值
195
int ln, rn, mn; // 左端,右端,最频 频
196
int le, ri; // 左右端点
197
};
198
Node node[ L * 3 ];
199![]()
200
T *a;
201
int le, ri;
202![]()
203
int init(int idx, int le, int ri) {
204
if ( le + 1 == ri ) {
205
node[ idx ].le = le;
206
node[ idx ].ri = ri;
207
node[ idx ].lv = node[ idx ].rv = node[ idx ].mv = a[ le ];
208
node[ idx ].ln = node[ idx ].rn = node[ idx ].mn = 1;
209
return 1;
210
}
211
int lc = (idx<<1);
212
int rc = (idx<<1)|1;
213
init(lc, le, (le+ri)>>1);
214
init(rc, (le+ri)>>1, ri );
215![]()
216
node[ idx ].le = le;
217
node[ idx ].ri = ri;
218
node[ idx ].lv = node[ lc ].lv;
219
node[ idx ].ln = node[ lc ].ln;
220
node[ idx ].rv = node[ rc ].rv;
221
node[ idx ].rn = node[ rc ].rn;
222
if ( node[ lc ].mn < node[ rc ].mn ) {
223
node[ idx ].mn = node[ rc ].mn;
224
node[ idx ].mv = node[ rc ].mv;
225
}
226
else {
227
node[ idx ].mn = node[ lc ].mn;
228
node[ idx ].mv = node[ lc ].mv;
229
}
230![]()
231
if ( node[ lc ].rv == node[ rc ].lv ) {
232
if ( node[ lc ].lv == node[ lc ].rv ) {
233
node[ idx ].ln += node[ rc ].ln;
234
}
235
if ( node[ rc ].lv == node[ rc ].rv ) {
236
node[ idx ].rn += node[ lc ].rn;
237
}
238
if ( node[ idx ].mn < node[ lc ].rn + node[ rc ].ln ) {
239
node[ idx ].mn = node[ lc ].rn + node[ rc ].ln;
240
node[ idx ].mv = node[ lc ].rv;
241
}
242
}
243
return 1;
244
}
245
int query(int idx, Node &qr) {
246
if ( (this->le <= node[idx].le) && (node[idx].ri <= this->ri) ) {
247
qr = node[ idx ];
248
return qr.mn;
249
}
250
if ( (this->le >= node[idx].ri) || (this->ri <= node[idx].le) ) {
251
qr.le = -1;
252
qr.ri = -2;
253
qr.ln = qr.rn = qr.mn = 0;
254
qr.lv = qr.rv = qr.mv = 0;
255
return 0;
256
}
257
int lc = (idx<<1);
258
int rc = (idx<<1)|1;
259
int mid = (node[idx].le + node[idx].ri)>>1;
260![]()
261
if ( (this->le < mid) && ( this->ri > mid) ) {
262
Node qle, qri;
263
query(lc, qle);
264
query(rc, qri);
265![]()
266
qr.le = le;
267
qr.ri = ri;
268
qr.lv = qle.lv;
269
qr.ln = qle.ln;
270
qr.rv = qri.rv;
271
qr.rn = qri.rn;
272
if ( qle.mn < qri.mn ) {
273
qr.mn = qri.mn;
274
qr.mv = qri.mv;
275
}
276
else {
277
qr.mn = qle.mn;
278
qr.mv = qle.mv;
279
}
280![]()
281
if ( qle.rv == qri.lv ) {
282
if ( qle.lv == qle.rv ) {
283
qr.ln += qri.ln;
284
}
285
if ( qri.lv == qri.rv ) {
286
qr.rn += qle.rn;
287
}
288
if ( qr.mn < qle.rn + qri.ln ) {
289
qr.mn = qle.rn + qri.ln;
290
qr.mv = qle.rv;
291
}
292
}
293![]()
294
return qr.mn;
295
}
296
if ( this->ri > mid ) {
297
return query(rc, qr);
298
}
299
return query(lc, qr);
300
}
301
};
302![]()
303
SegTree<int> prob;
304
int a[ L ];
305
int n;
306![]()
307
int main() {
308
int i, q, le, ri;
309
while ( (1 == scanf("%d", &n)) && (0 < n) ) {
310
scanf("%d", &q);
311
for ( i = 1; i <= n; ++i ) {
312
scanf("%d", a+i);
313
}
314
prob.init(a, 1, n+1);
315
while ( q-- > 0 ) {
316
scanf("%d%d", &le, &ri);
317
printf("%d\n", prob.query(le, ri+1));
318
}
319
}
320
return 0;
321
}
322
*/
323
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
119
120
121

122
123
124
125

126
127
128
129

130
131
132
133
134
135
136
137
138
139
140
141
142
143
144

145
146

147
148

149
150
151
152

153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323