[XJB出题] [莫队] [线段树] 聚会(reunion)

题目传送门(感谢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 n105T=10ai105
对于 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 n103T1030ai105
对于 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 n103T103ai109
对于 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 nT5104ai109lr
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(Tn log2n)
表示暴力只比莫队+线段树慢了4秒…
所以遇见区间求众数可以打打暴力兴许就A了…
其实有时候莫队比暴力还慢也不知道是不是我写的常数大…

UPD:有更优秀的算法可以在线解决这个问题,请参考这里
来源 Source

原创题,又在数学课上瞎想…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值