#P10181. 龙逐千灯幻

    ID: 9528 Type: RemoteJudge 1200ms 128MiB Tried: 1 Accepted: 0 Difficulty: 7 Uploaded By: Tags>线段树并查集凸完全单调性, wqs 二分根号分治单调栈

龙逐千灯幻

题目背景

龙年到,帆帆也举起了自己的彩龙灯,他自己也要变成大彩龙啦!

题目描述

帆帆一共有 nn 盏龙灯,第 ii 盏的颜色是 aia_i

帆帆认为一段区间 [l,r][l,r] 的美观度 f(l,r)f(l,r)alara_l\cdots a_r 中的不同颜色个数。

帆帆准备带着自己的龙灯去玩,他一共计划去玩 mm 天,第 ii 天,他会带着自己的 1xi1\cdots x_i 号龙灯,但是他发现如果把很多龙灯装在一起,那么别人只会注意到其中有多少种不同的颜色。

因此帆帆准备把这 xix_i 个龙灯按照编号顺序分成恰好 kik_i 个区间,满足每盏灯恰好在一个区间内。

那么帆帆这次出行的美观度就为所有区间的美观度的和。

请你帮帮帆帆最大化每一次出行的美观度。

输入格式

第一行五个整数 n,m,id,seed,limxn,m,id,seed,limx,分别代表序列长度,询问次数,以及 subtask\texttt{subtask} 编号(样例中的 id=0id=0),随机数种子,以及一个和询问有关的参数 limxlimx

因为本题输入量过大,因此采用如下方式生成询问:

我们使用下面的代码生成一个伪随机数列:

uint64_t PRG_state;
uint64_t get_number()
{
    PRG_state ^= PRG_state << 13;
    PRG_state ^= PRG_state >> 7;
    PRG_state ^= PRG_state << 17;
    return PRG_state;
}
int readW(int l,int r)
{
	return get_number()%(r-l+1)+l;
}

一开始 PRG_state=seed,你每次调用 readW(l,r) 会返回一个 [l,r][l,r] 内的随机数。

第二行 nn 个整数,第 ii 个整数代表 aia_i

xi,ki,cix_i,k_i,c_i 表示第 ii 组询问需要的参数 x,k,cx,k,c,其中 cc 的作用见输出格式,那么所有询问的参数可以用以下程序生成:

for (int i = 1; i <= m; ++i) {
	x[i] = readW(limx, n);
	k[i] = readW(1, x[i]);
	c[i] = readW(0, 1e7);
}

注:请不要在运行上述代码段获得各组询问的参数之前调用 readW() 函数,否则无法获得正确的询问信息。 本题不需要利用该伪随机数生成器的特殊性质,你只需将 get_number() 视为一个每次调用独立且均匀随机地生成一个无符号 6464 位整数的生成器即可。本题也不需要优化伪随机数生成器的内部实现。

输出格式

为了减少输出量,我们使用如下方式进行信息压缩:

如果第 ii 组询问的答案为 ansians_i,其生成参数为 cic_i,那么你需要输出:

i=1m(ansi×ci)\bigoplus\limits_{i=1}^m(ans_i\times c_i)

其中 \bigoplus 为异或运算,该值显然一定位于 long long 能表示的整数范围内。

5 5 0 956144375 1
2 4 1 5 2 

21971409
10 10 0 478178732 1
2 2 1 1 2 1 2 1 2 1 

2834792

提示

【样例1解释】

询问分别是:

3 1 6121576
5 3 3089509
1 1 4506170
3 1 2821007
1 1 7941511

答案分别是:

3
5
1
3
1

对于第一组询问,要分成一个区间,那么就是 [1,3][1,3],美观度就是 f(1,3)=3f(1,3)=3

对于第二组询问,最优的方案是分成 [1,3],[4,4],[5,5][1,3],[4,4],[5,5],美观度是 f(1,3)+f(4,4)+f(5,5)=5f(1,3)+f(4,4)+f(5,5)=5

后三个询问同理。

【样例2解释】

询问分别是:

8 4 6858024
3 2 236530
2 2 8140891
5 3 4562139
8 7 4749403
7 4 4319971
5 1 5063575
3 1 7343109
6 2 1566851
3 1 7959241

询问答案分别是:

7
3
2
5
8
7
2
2
4
2

【数据范围】

本题采用捆绑测试。

  • 子任务一(1010 分):1n5001 \leq n\leq 500
  • 子任务二(1515 分):1n30001\leq n\leq 3000
  • 子任务三(1515 分):m=1m=1
  • 子任务四(2020 分):1ai301\le a_i\le 30
  • 子任务五(2020 分):1n4×1041\leq n\leq 4\times 10^4
  • 子任务六(2020 分):无特殊限制。

对于 100%100\% 的数据,1n1051 \leq n\leq 10^51m1061\leq m\leq 10^60seed1090\leq seed\leq 10^91limxn1\leq limx\leq n1ain1\leq a_i\leq n