传统题 5000ms 512MiB

子序列

该比赛已结束,您无法在比赛模式下递交该题目。您可以点击“在题库中打开”以普通模式查看和递交本题。

子序列

题目描述

给定一个长度为 NN 的序列 AA。对于一个子序列,若任意两个在子序列中相邻的元素 Ax,Ay(x<y)A_x,A_y (x < y) ,都满足 Ax<AyA_x < A_y,且原序列的区间 [x,y)[x,y) 中不存在严格大于 AxA_x 的值,那么我们就说这个子序列是"贪心上升"的。

定义一个子序列的权值为子序列中所有元素的和,给定 QQ 次询问,每次询问给定一个区间 [L,R][L,R] ,请你求出这个区间中权值最大的贪心上升子序列的权值是多少。

本题输入输出量过大,因此采用随机方式生成询问区间, 并且你只需要输出所有询问答案的异或和。部分测点要求强制在线,请注意阅读输入格式和输出格式。

输入格式

第一行输入 4 个正整数 N,Q,T,SN,Q,T,S ,表示序列长度,询问数量,强制在线系数和随机参数。

接下来一行,输入 NN 个正整数,表示序列 AA.

询问区间 [L,R][L,R] 由以下方式生成:

namespace GenHelper {
  unsigned z1,z2,z3,z4,b;
  unsigned rand_()
  {
  b=((z1<<6)^z1)>>13;
  z1=((z1&4294967294U)<<18)^b;
  b=((z2<<2)^z2)>>27;
  z2=((z2&4294967288U)<<2)^b;
  b=((z3<<13)^z3)>>21;
  z3=((z3&4294967280U)<<7)^b;
  b=((z4<<3)^z4)>>12;
  z4=((z4&4294967168U)<<13)^b;
  return (z1^z2^z3^z4);
  }
}
void srand(unsigned x)
{using namespace GenHelper;
z1=x; z2=(~x)^0x233333333U; z3=x^0x1234598766U; z4=(~x)+51;}
int read()
{
  using namespace GenHelper;
  int a=rand_()&32767;
  int b=rand_()&32767;
  return a*32768+b;
}

你需要在你的程序中加入以上代码,并在输入 SS 后调用 srand(S);

每次询问时,使用以下方式得到区间 [L,R][L,R] 的范围。

int L=(lastans*T+read())%n+1;
int R=(lastans*T+read())%n+1;
if(L>R) swap(L,R);

其中,lastanslastans 表示之前所有询问答案的异或和。一开始 lastans=0lastans = 0.

输出格式

一行,输出一个非负整数,表示所有答案的异或和。

样例 #1

样例输入 #1

8 4 0 114514
6 5 7 3 8 4 5 7

样例输出 #1

21

样例 #2

样例输入 #2

10 5 1 1919810
3 2 3 0 8 5 7 2 6 9

样例输出 #2

6

提示

样例解释:

对于样例 1 的每个询问,L,RL,R 和这个询问的答案依次为:

1 1 6
5 8 16
2 4 12
3 6 15

对于样例 2 的每个询问, L,RL,R 和这个询问的答案依次为:

3 8 12
1 9 13
10 10 9
7 9 8
9 9 6

数据范围:

% NN \le QQ \le T=T=
1010 300300 00
2020 30003000
3×1053 \times 10^5
11
3030 5×1055 \times 10^5 10710^7

对于所有数据,保证满足 0ai,S109T[0,1]0 \le a_i,S \le 10^9,T \in [0,1].

[YDRS#011 + YDRB#005] 欢欢喜喜过大年 · 2025 云斗新年挑战赛

未参加
状态
已结束
规则
IOI(严格)
题目
9
开始于
2025-1-25 9:30
结束于
2025-1-28 22:30
持续时间
6 小时
主持人
参赛人数
184