T84081 [青五联考样板题] 快速排序

题目背景

高考结束,各校展开了激烈的宣传之战。 “XX人数全OOO第一” “XXX创历史新高” “XX率领先全O”…… ------ 本题为青五联考样板题,另外三道样板题:[[青五联考样板题] 前缀和](https://www.luogu.org/problemnew/show/U75406)、[[青五联考样板题] 整除分块](https://www.luogu.org/problemnew/show/U74567)、[[青五联考样板题]快速数论变换](https://www.luogu.org/problemnew/show/U75643)。 ## 非常抱歉,之前的题目描述不清。为便于理解题意,题目描述中已增添如下文字:“如果按照上一条规则比较不出两所学校哪一所学校强,那么编号*小*的学校更强”。 ## 空间限制已放宽——MLE 会变成 TLE。

题目描述

然而,作为 OIer 的 Shinko 并没有被宣传迷惑双眼。她决定按照 NOI 聚乙烯牌人数和 NOIP 省肆人数两个指标,给学校排名。 Shinko 认为,相比 NOIP 省肆人数,NOI 聚乙烯牌人数更能反映一个学校的实力;因此,应该这样比较两所学校: > 若甲乙两校的 NOI 聚乙烯牌人数相同,则 NOIP 省肆人数多的学校更强;否则 NOI 聚乙烯牌人数多的学校更强。 > 如果按照上一条规则比较不出两所学校哪一所学校强,那么编号**小**的学校更强。 例如: - 1 号学校的 NOI 聚乙烯牌人数为 $1$,NOIP 省肆人数为 $2$;2 号学校的 NOI 聚乙烯牌人数为 $2$,NOIP 省肆人数为 $1$。2 号学校比 1 号学校强。 - 3 号学校的 NOI 聚乙烯牌人数为 $2$,NOIP 省肆人数为 $2$;4 号学校的 NOI 聚乙烯牌人数为 $2$,NOIP 省肆人数为 $1$。3 号学校比 4 号学校强。 - 5 号学校的 NOI 聚乙烯牌人数为 $1$,NOIP 省肆人数为 $1$;6 号学校的 NOI 聚乙烯牌人数为 $1$,NOIP 省肆人数为 $1$。5 号学校比 6 号学校强。 现在 Shinko 交了很多的存储费、仓储费、出仓费、出场费、出厂费、出差费、出车费、车船费、乘车费、存车费、藏车费、铲车费、擦车费、叉车费、查车费、查重费、重测费、冲刺费、摧残费、吃醋费,才终于买到了 $n$ 所学校的数据。她想知道排第 $p$ 名的学校的编号。一个学校的排名定义为比这所学校强的学校数加 $1$。根据“强”的定义,每个排名唯一对应一所学校。 可是 Shinko 没有电脑,你能回答她的问题吗?毕竟,这会让她认识到,能帮她解决问题的学校才是最强的! 由于 Shinko 是一个善于提问的好孩子,她的问题很多。为了节省你的时间,Shinko 决定把本题中涉及到的信息按照特殊的形式组织起来,具体见下面的“输入格式”。

输入格式

本题输入格式特殊,请留意。 输入只有 $1$ 行,含有 $4$ 个正整数 $n,m,a_0,b_0$,$n$ 表示学校数,$m$ 表示 Shinko 的问题数,$a_0,b_0$ 的意义将会在下面叙述。 为得到 $n$ 所学校的数据,你需要调用 $2n$ 次 `next_school` 函数。每次调用的参数和返回值如下所述。 - 第一次调用 `next_school` 函数时,传入的参数是 $a_0$;此后每一次调用 `next_school` 函数,传入的参数是上一次调用 `next_school` 函数的返回值。 - 第 $2k-1,2k\ (1\le k\le n)$ 次调用 `next_school` 函数的返回值分别是编号为 $k$ 的学校的 NOI 聚乙烯牌人数和 NOIP 省肆人数。 为得到 Shinko 的 $m$ 个问题,你需要调用 $m$ 次 `next_query` 函数。每次调用的参数和返回值如下所述。 - 第一次调用 `next_query` 函数时,传入的参数是 $(b_0,n)$;此后每一次调用 `next_query` 函数,传入的参数是上一次调用 `next_query` 函数的返回值和 $n$。 - 第 $t\ (1\le t\le m)$ 次调用 `next_query` 函数的返回值是 Shinko 的第 $t$ 个问题,即题目描述中的 $p$。 提示与说明中有一个示例程序演示如何获得输入。 `next_school` 函数和 `next_query` 函数如下。 ```cpp inline unsigned next_school(unsigned x){ x^=x5,x^=x

输出格式

输出共有 $m$ 行,每行一个正整数 $q$,表示排名为 $p$ 的学校编号。

说明/提示

对于 $10\%$ 的数据, $n,m\le 3$。 对于 $20\%$ 的数据, $n,m\le 10$。 对于 $40\%$ 的数据, $n\le 1000$。 对于 $70\%$ 的数据, $n\le 10^{5}$。 对于 $100\%$ 的数据,$1\le n \le 10^{7},\ 1\le m \le 750,1\le a_0,b_0 \le 10^9$。 ------ #### 样例解释 输入的 $20$ 所学校的 NOI 聚乙烯牌人数和 NOIP 省肆人数分别为: $$\begin{aligned}&(7081,8599), (3208,346), (9548,4054), (4826,1069), (5166,3726),\\&(4635,3552), (3793,4557), (3808,8168), (426,3810), (7001,7628),\\ &(5723,7388), (7701,2931), (9520,66), (7456,9840), (5967,7483),\\ &(881,9033), (5578,41), (4078,6415), (427,1745), (1998,4739)\end{aligned}$$ $8$ 个询问的 $p$ 分别是:$10,20,19,14,16,7,4,1$。 经过计算,得到的答案是:$5,9,19,8,2,15,14,3$。 ~~从这个样例,你知道哪所学校最强了么?~~ ------ #### 示例代码 ```cpp #include #define MAXN 10000005 using namespace std; int CH2CH2n[MAXN],fourth[MAXN],rank_i[MAXN]; unsigned next_school(unsigned x); unsigned next_query(unsigned x,int n); int main(void){ int n,m,a0,b0; cin >> n >> m >> a0 >> b0; for (int i=1;i