题目链接:传送门

Description

有 n(1n105)(1 \leq n \leq 10^5)个小朋友,过年了,要发放 m(1m105)m(1 \leq m \leq 10^5)次礼物。 每次发放,会给出三个参数 l,r,k(1lrn,1k105)(1 \leq l \leq r \leq n, 1 \leq k \leq 10^5),表示给区间[l,r] 内的小朋友都发一个礼物k。 所有礼物发放完成后,对于每一个小朋友,回答他接受的礼物中,出现次数最多的礼物是什么。如果有多个,输出编号最小的那个;如果不存在,输出 -1。

Sample Input

6 3 1 5 1 2 3 2 3 4 2

Sample Output

1 1 2 1 1 -1

Solution

先用扫描线和差分的思想,把修改都拆成在l处+k,在r+1处-k,然后用权值线段树维护权值出现的次数以及最大值即可

Summary

这道题一开始就是想的权值线段树,但是对权值线段树的认识还停留在只能查第k大上,不知道怎么求最大值。。。现在看来自己就是个傻x然后就不知道该怎么做。

Code

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
#include <bits/stdc++.h>
using namespace std;
const int Maxn = 100000 + 100;
int N, M, Cnt;
struct Tree
{
int val, id;
}Tree[Maxn * 4];

vector <int> q[Maxn];

inline void push_up (int x)
{
if (Tree[x << 1].val == Tree[x << 1 | 1].val)
Tree[x].val = Tree[x << 1].val, Tree[x].id = min(Tree[x << 1].id, Tree[x << 1 | 1].id);
else if (Tree[x << 1].val > Tree[x << 1 | 1].val)
Tree[x].val = Tree[x << 1].val, Tree[x].id = Tree[x << 1].id;
else Tree[x].val = Tree[x << 1 | 1].val, Tree[x].id = Tree[x << 1 | 1].id;
}

inline void build (int root, int l, int r)
{
if (l == r)
{
Tree[root].id = l;
Tree[root].val = 0;
return ;
}
int mid = (l + r) >> 1;
build(root << 1, l, mid);
build(root << 1 | 1, mid + 1, r);
push_up(root);
}

inline void update (int root, int l, int r, int x, int z)
{
if (l == r)
{
Tree[root].val += z;
return ;
}
int mid = (l + r) >> 1;
if (x <= mid)
update(root << 1, l, mid, x, z);
else update(root << 1 | 1, mid + 1, r, x, z);
push_up(root);
}

int main()
{
#ifdef hk_cnyali
freopen("A.in", "r", stdin);
freopen("A.out", "w", stdout);
#endif
scanf("%d%d", &N, &M);
for (int i = 1; i <= M; ++i)
{
int x, y, z;
scanf("%d%d%d", &x, &y, &z);
q[x].push_back(z);
q[y + 1].push_back(-z);
}
build(1, 1, 100000);
for (int i = 1; i <= N; ++i)
{
for (int j = 0; j < q[i].size(); ++j)
{
if (q[i][j] > 0)
update(1, 1, 100000, q[i][j], 1);
else update(1, 1, 100000, -q[i][j], -1);
}
printf("%d\n", !Tree[1].val ? -1 : Tree[1].id);
}
return 0;
}