问题2991--RS哥哥的分块

2991: RS哥哥的分块

时间限制: 2 Sec  内存限制: 128 MB
提交: 258  解决: 11
[状态] [讨论版] [提交] [命题人:]
题目描述
        rs少爷正在思考一个经典问题:有n个数,怎样找出这n个数中出现次数最多的数?n可能很大,计算机并不能将这n个数同时读取到内存中。而且数的范围只限制是正整数,并不限制大小,这意味并不能使用基数排序来解决这个问题。
        rs少爷的队友给出了下面这种解法:分块处理,将n个数分为m块,每块k个数。计算机每次读取k个数,将这k个数中出现次数最多的数和它出现的次数记录为这块数据的结果。当m块都计算完成后,再根据这m块的结果,计算n个数中出现次数最多的数。
        聪明的rs少爷一眼就发现了这种做法的问题,这种做法并不能保证一定正确,在一些数据下,这种做法给出的答案是错误的。相信聪明的你也发现了,所以,你能根据各个分块的结果,判断rs少爷的队友给出的结果是否是一定正确的吗?
输入
多实例,实例数<=5。
输入第一行包含两个整数n, m (1<=n<=1014, 1<=m<=105)。保证n%m == 0。
接下来m行,每行两个整数ai, bi(1<=ai<=106, 1<=bi<=n/m)。ai代表这一个分块中出现次数最多的数,bi代表它出现的次数(可能是因为命运吧,每个分块中出现次数最多的数总是唯一的,而且这个数都在[1, 106]内)。
接下来包含一个整数ans。代表rs少爷的队友给出的结果。
保证所有实例m的和小于等于105
输出
每个实例输出一行。如果rs少爷的队友给出的结果一定是正确的(当有多个数出现次数最多,输出任意一个就认为是正确的),输出“YES”;否则,输出“NO”。
样例输入 Copy
6 2
2 2
3 3
3

9 3 
1 3
2 2
2 2
2
样例输出 Copy
YES
NO
来源/分类