luogu#P9055. [集训队互测 2021] 数列重排

[集训队互测 2021] 数列重排

题目背景

dottle bot。

题目描述

定义一个数列区间的 mex\textrm{mex} 为区间中最小的没有出现过的自然数,定义一个数列的价值为其中 mexk\textrm{mex}\geq k 的区间数量。

给定 nn 个小于 mm 的自然数和一个区间 [l,r][l,r],令 f(k)f(k) 表示 nn 个数构成的数列所有重排列中数列价值的最大值,对于每一个 k[l,r]k\in [l,r],求出 f(k)f(k)

aia_i 表示数字 ii 出现的次数,保证存在正整数 XX,使得 im1,ai{X,X+1}\forall i\le m-1,a_i\in \{X,X+1\}

输入格式

由于 nn 可能很大,将采取如下方式减少读入量:

第一行四个整数 m,l,r,Xm,l,r,X

第二行一个长度为 mm0101 串,若其中第 ii 个位置为 11 则数字 i1i-1 的出现次数为 X+1X+1,否则出现次数为 XX

根据输入可以推出 n=mX+Sn=mX+S,其中 SS0101 串中 11 的数量。

输出格式

为了减少输出量,令 ans=i=lrans=\displaystyle{\bigoplus_{i=l}^r}(233if(i)mod998244353) (233^if(i)\bmod 998244353),其中 \displaystyle\bigoplus 表示二进制下的按位异或,输出一行一个整数 ansans

2 0 1 2
10
3034
14 1 14 13
10110101110101
379883349

提示

样例 1 解释

在样例给出的数列中,有 33002211,任意排列 f(0)f(0) 均为 1515,排列为 01010\textrm{01010}f(1)f(1) 有最大值 1313,答案为:

$$\displaystyle (233^0\times 15\bmod 998244353)\oplus(233^1\times 13\bmod 998244353)=3034 $$

数据范围

  • Subtask 1(5 points):n,m9n,m\leq 9
  • Subtask 2(15 points):n,m200n,m\leq 200
  • Subtask 3(15 points):n,m5×103n,m\leq 5\times 10^3
  • Subtask 4(5 points):m2m\leq 2l=0l=0r=1r=1
  • Subtask 5(10 points):m106m\leq 10^6l=ml=mr=mr=m
  • Subtask 6(10 points):m106m\leq 10^6X=1X=1si=0s_i=0
  • Subtask 7(15 points):m106m\leq 10^6rl+1104r-l+1\leq 10^4
  • Subtask 8(15 points):m2×106m\leq 2\times 10^6
  • Subtask 9(10 points):无特殊限制。

对于所有数据,满足 n109n\leq 10^9m107m\leq 10^70lrm0\leq l\leq r\leq mX1X\geq 1