UOJ Logo

NOI.AC

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#212185#3816. 元素Panjunnan013ms1292kbC++112.5kb2024-10-13 11:54:402024-10-13 12:30:55

answer

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

const int MAXN = 100005;
int n, q, a[MAXN];
int segTree[4 * MAXN], lazy[4 * MAXN];
int cnt[MAXN]; // 离散化后的元素计数

// 离散化
int getID(int x) {
    return lower_bound(cnt, cnt + n, x) - cnt;
}

// 线段树更新函数
void update(int node, int start, int end, int l, int r, int val) {
    if (lazy[node] != -1) {
        segTree[node] = (end - start + 1) * lazy[node];
        if (start != end) {
            lazy[node * 2] = lazy[node];
            lazy[node * 2 + 1] = lazy[node];
        }
        lazy[node] = -1;
    }
    if (start > end || start > r || end < l) return;
    if (start >= l && end <= r) {
        segTree[node] = (end - start + 1) * val;
        if (start != end) {
            lazy[node * 2] = val;
            lazy[node * 2 + 1] = val;
        }
        return;
    }
    int mid = (start + end) / 2;
    update(node * 2, start, mid, l, r, val);
    update(node * 2 + 1, mid + 1, end, l, r, val);
    segTree[node] = segTree[node * 2] + segTree[node * 2 + 1];
}

// 线段树查询函数
int query(int node, int start, int end, int l, int r) {
    if (lazy[node] != -1) {
        segTree[node] = (end - start + 1) * lazy[node];
        if (start != end) {
            lazy[node * 2] = lazy[node];
            lazy[node * 2 + 1] = lazy[node];
        }
        lazy[node] = -1;
    }
    if (start > end || start > r || end < l) return 0;
    if (start >= l && end <= r) return segTree[node];
    int mid = (start + end) / 2;
    int p1 = query(node * 2, start, mid, l, r);
    int p2 = query(node * 2 + 1, mid + 1, end, l, r);
    return p1 + p2;
}

int main() {
    cin >> n >> q;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
        cnt[a[i]]++;
    }
    for (int i = 1; i <= n; i++) {
        cnt[i] += cnt[i - 1];
    }
    int last = 0;
    for (int i = 1; i <= n; i++) {
        cnt[i] += last;
        last = cnt[i];
    }
    for (int i = 1; i <= n; i++) {
        a[i] = getID(a[i]);
    }
    for (int i = 1; i <= 4 * n; i++) {
        segTree[i] = 0;
        lazy[i] = -1;
    }
    for (int i = 1; i <= n; i++) {
        update(1, 1, n, i, i, 1);
    }
    while (q--) {
        int l, r;
        cin >> l >> r;
        int x = query(1, 1, n, l, r) + 1;
        int y = r;
        while (y - x + 1 > r - l + 1) {
            if (query(1, 1, n, l, y) == r - l + 1) break;
            y--;
        }
        cout << y - x + 1 << endl;
    }
    return 0;
}

详细

小提示:点击横条可展开更详细的信息

Test #1:

score: 0
Wrong Answer
time: 0ms
memory: 1220kb

input:

10 10
492 1887 1028 1209 252 1860 1527 699 1656 928
6 9
2 8
3 10
2 3
1 8
6 9
3 5
4 7
1 4
2 7

output:

5
1
2
1
0
5
2
3
0
1

result:

wrong answer 1st numbers differ - expected: '4', found: '5'

Test #2:

score: 0
Wrong Answer
time: 0ms
memory: 1228kb

input:

50 50
413 1208 1780 279 1403 1706 11 1583 333 355 1068 1270 1835 1042 957 423 1140 1153 1709 284 281...

output:

34
11
14
17
43
0
16
9
0
23
10
11
28
29
35
22
17
28
1
44
25
13
21
6
15
6
15
21
6
1
24
36
28
19
29
13
...

result:

wrong answer 1st numbers differ - expected: '10', found: '34'

Test #3:

score: 0
Wrong Answer
time: 0ms
memory: 1228kb

input:

50 50
407 1089 1459 1626 1917 555 1611 492 443 1149 406 1259 1729 1554 577 1310 1899 1578 1005 1459 ...

output:

1
8
29
6
21
23
3
8
20
1
19
2
0
25
8
24
42
38
25
16
23
12
23
10
10
28
4
18
10
32
45
32
17
23
11
16
4
...

result:

wrong answer 1st numbers differ - expected: '32', found: '1'

Test #4:

score: 0
Wrong Answer
time: 1ms
memory: 1224kb

input:

50 50
1792 843 1272 547 698 1086 1174 1607 1277 1055 506 881 1445 372 1076 1770 647 1086 320 1912 18...

output:

11
28
2
28
16
18
0
1
25
30
30
4
8
12
30
4
5
2
8
12
26
6
35
7
0
41
11
10
11
6
20
21
0
26
12
4
24
42
3...

result:

wrong answer 1st numbers differ - expected: '34', found: '11'

Test #5:

score: 0
Wrong Answer
time: 1ms
memory: 1224kb

input:

50 50
44 1463 245 1177 1728 1335 768 475 790 623 1466 98 672 230 339 1428 872 1905 405 1260 1503 813...

output:

13
19
8
18
40
30
3
6
6
18
1
15
14
9
33
32
25
9
9
0
8
17
28
38
19
40
32
14
25
14
13
15
2
31
12
3
10
2...

result:

wrong answer 1st numbers differ - expected: '19', found: '13'

Test #6:

score: 0
Wrong Answer
time: 1ms
memory: 1228kb

input:

50 50
695 974 1078 231 500 498 1308 1666 1925 766 1994 1776 1955 1766 1191 1021 1581 1202 615 1230 1...

output:

28
24
18
4
0
8
3
38
21
8
9
39
2
23
3
23
5
24
11
21
24
7
39
15
4
37
5
24
6
2
6
17
10
4
9
15
12
37
12
...

result:

wrong answer 1st numbers differ - expected: '11', found: '28'

Test #7:

score: 0
Wrong Answer
time: 2ms
memory: 1232kb

input:

200 200
403 329 389 1103 695 1865 818 671 750 1868 1422 422 1186 1431 172 1569 460 1580 406 1049 138...

output:

45
49
180
119
93
8
10
47
57
3
59
12
44
15
39
99
27
99
163
51
22
137
61
0
27
15
75
113
47
4
86
131
13...

result:

wrong answer 1st numbers differ - expected: '131', found: '45'

Test #8:

score: 0
Wrong Answer
time: 3ms
memory: 1232kb

input:

200 200
147 1386 1788 1493 1919 1136 861 871 1895 1006 1776 346 381 1666 296 289 568 1616 1535 531 2...

output:

81
97
7
38
30
19
69
9
10
44
84
115
124
83
65
66
26
134
58
30
118
39
14
76
91
119
2
49
7
119
114
185
...

result:

wrong answer 1st numbers differ - expected: '103', found: '81'

Test #9:

score: 0
Wrong Answer
time: 3ms
memory: 1292kb

input:

2000 2000
1154 852 1088 1530 639 1318 1250 1222 1341 1070 205 656 903 1491 808 317 756 1962 102 1445...

output:

250
1547
679
106
755
114
25
139
34
479
604
109
502
1041
272
7
476
280
950
1839
89
771
1012
949
320
5...

result:

wrong answer 1st numbers differ - expected: '830', found: '250'

Test #10:

score: 0
Wrong Answer
time: 2ms
memory: 1292kb

input:

2000 2000
1232 731 1651 991 1681 1739 776 240 829 1337 493 248 214 1852 716 325 1280 1207 380 724 11...

output:

586
256
25
207
1048
442
791
390
747
1321
582
1483
1244
314
243
556
272
1079
845
127
496
434
677
327
...

result:

wrong answer 1st numbers differ - expected: '1062', found: '586'