题目传送门(感谢Vijos域功能的大力支持……)
题目描述 Description
FZ酱有很多朋友,期末考试结束了,她邀请了 n n n个朋友来聚会,FZ酱把她的朋友编号为 1 1 1~ n n n。
朋友们到来的时间有早有晚,FZ酱以自己到达的时刻记为 0 0 0时刻,朋友到达的时刻就可以表示为他们与FZ酱到达时刻的差值。记时刻小于 0 0 0为在FZ酱到达之前到达,大于 0 0 0为在FZ酱到达之后到达。
所有朋友都到齐了,FZ酱很好奇朋友们的到达时间,她统计了这 n n n个朋友的到达时间,发现这些数据有集中的趋势。想到数学课上学的一些知识,她想统计一下编号 [ l , r ] [l,r] [l,r]之内的朋友们什么时候来的最多。
由于FZ酱讨厌做数学题,于是她将这项工作推给了HSD桑,HSD桑看了一眼这些时刻,就将这项任务交给了你。你大喊道:“凭什么交给我啊!”可是HSD桑已经跑远了。所以请完成这项任务。
输入 Input
第 1 1 1行两个正整数 n n n和 T T T,表示FZ酱的朋友数n和她希望调查的区间个数 T T T。
第 2 2 2行 n n n个整数,第i个整数表示编号为i的朋友到达的时刻 a i a_i ai。
第 3 3 3~ T + 4 T+4 T+4行,每行两个正整数 l l l, r r r,表示希望调查的区间 [ l , r ] [l,r] [l,r]。
输出 Output
共 T T T行,对于第 i i i行输出为对第 i i i个询问的答案。
如果有超过 1 1 1个时刻到达的人数最多,请输出最小的时刻。
样例输入 Sample Input
10 5
1 1 3 3 1 2 3 1 2 3
1 10
2 5
6 9
3 10
7 10
样例输出 Sample Output
1
1
2
3
3
样例解释 Explanation
对于 [ 1 , 10 ] [1,10] [1,10]中,在 1 1 1时刻到达的共 4 4 4人,在 2 2 2时刻到达的共 2 2 2人,在 3 3 3时刻到达的共 4 4 4人。在 1 , 3 1,3 1,3时刻到达人数相同,所以答案为较小的时刻 1 1 1;
对于 [ 2 , 5 ] [2,5] [2,5]中,在 1 1 1时刻到达的共 2 2 2人,在 3 3 3时刻到达的共 2 2 2人。在 1 , 3 1,3 1,3时刻到达人数相同,所以答案为较小的时刻 1 1 1;
对于 [ 6 , 9 ] [6,9] [6,9]中,在 1 1 1时刻到达的共 1 1 1人,在 2 2 2时刻到达的共 2 2 2人,在 3 3 3时刻到达的共 1 1 1人。所以答案为 2 2 2;
对于 [ 3 , 10 ] [3,10] [3,10]中,在 1 1 1时刻到达的共 2 2 2人,在 2 2 2时刻到达的共 2 2 2人,在 3 3 3时刻到达的共 4 4 4人。所以答案为 3 3 3;
对于 [ 7 , 10 ] [7,10] [7,10]中,在 1 1 1时刻到达的共 1 1 1人,在 2 2 2时刻到达的共 1 1 1人,在 3 3 3时刻到达的共 2 2 2人。所以答案为 3 3 3。
限制 Limits
共 10 10 10个测试点,只有输出与标准输出完全相同才可以获得 10 10 10pts。
对于 10 % 10\% 10%的数据,满足 n ≤ 1 0 5 , T = 1 , 0 ≤ a i ≤ 1 0 5 n≤10^5,T=1,0≤a_i≤10^5 n≤105,T=1,0≤ai≤105;
对于 30 % 30\% 30%的数据,满足 n ≤ 1 0 3 , T ≤ 1 0 3 , 0 ≤ a i ≤ 1 0 5 n≤10^3,T≤10^3,0≤a_i≤10^5 n≤103,T≤103,0≤ai≤105;
对于 60 % 60\% 60%的数据,满足 n ≤ 1 0 3 , T ≤ 1 0 3 , ∣ a i ∣ ≤ 1 0 9 n≤10^3,T≤10^3,|a_i|≤10^9 n≤103,T≤103,∣ai∣≤109;
对于 100 % 100\% 100%的数据,满足 n , T ≤ 5 ∗ 1 0 4 , ∣ a i ∣ ≤ 1 0 9 , l ≤ r n,T≤5*10^4,|a_i|≤10^9,l≤r n,T≤5∗104,∣ai∣≤109,l≤r。
Time Limit : 8 s 8s 8s & Memory Limit : 512 M B 512MB 512MB
题解 Solution
翻译一下,就是求区间
[
l
,
r
]
[l,r]
[l,r]中的众数。
对于10%的数据:
送分,暴力。
对于30%的数据:
送分,暴力。
对于60%的数据:
离散化,送分,暴力。
100%的数据?
首先线段树是不可行的,众数不满足区间加法,所以不能合并。
同理,分块也挂了。
注意到只有区间查询并没有修改,所以上莫队搞定…
但是这貌似并不能在
O
(
1
)
O(1)
O(1)时间内转移答案…好像是
O
(
n
)
O(n)
O(n)扫一遍区间最值?还有动态修改?
线段树维护即可。
貌似常数巨大?好吧我认了。
ST表也可以维护区间最值,但是并不要最值是多少而是最值对应的数…
时间复杂度
O
(
T
n
log
2
n
)
O(T\sqrt n \log_2 n)
O(Tnlog2n)。
表示暴力只比莫队+线段树慢了4秒…
所以遇见区间求众数可以打打暴力兴许就A了…
其实有时候莫队比暴力还慢也不知道是不是我写的常数大…
UPD:有更优秀的算法可以在线解决这个问题,请参考这里
来源 Source
原创题,又在数学课上瞎想…