「Cfz Round 1」Wqs Game

题目背景

『博』和『奕』喜欢博弈,尤其喜欢 wqs 带权博弈。

题目描述

wqs 带权博弈在一个数列 $\{a_i\}$ 上进行,对应有一个 $01$ 串 $\{b_i\}$。 1. 若 $b_i=0$,则 $a_i$ 这个数字是属于『博』的; 2. 若 $b_i=1$,则 $a_i$ 这个数字是属于『奕』的。 游戏规则是,每次给定一个区间 $[l,r]$,从 $a_l$ 到 $a_r$,拥有这个数的人**依次**决定选该数或者不选,两个人都会采用**最优策略**。 因为『博』很强大,她会让着『奕』,于是博弈的规则是,如果最后两个人选的数**按位异或和不为零**,则『奕』获胜,否则『博』获胜。 注意每个人**能看到**对方的选数情况,可以选**多个**数(只要这个数是自己的),最后计算两个人选数的总**异或**和。 对于任意区间 $[l,r]$,若『奕』获胜,则 $w(l,r)=1$,否则 $w(l,r)=0$。 每次查询 $\sum\limits_{l=L}^R\sum\limits_{r=l}^Rw(l,r)$ 的值,对 $2^{32}$ 取模。 由于输入输出量过大,对于 $tp\ne 0$ 的测试点,选手需要自行生成数列 $a_i$ 和询问区间 $[L,R]$,并用特殊方式输出答案。 注意正解**不依赖**特殊的输入输出方式。

输入输出格式

输入格式


第一行三个正整数 $n,q,tp$,表示数列长度,天数以及每天局数,以及读入方式。 第二行一个长度为 $n$ 的字符串,表示 $01$ 串 $\{b_i\}$; 若 $tp=0$,则第三行 $n$ 个正整数,表示数列 $\{a_i\}$,接下来 $q$ 行,每行两个正整数 $L,R$,表示询问 $\sum\limits_{l=L}^R\sum\limits_{r=l}^Rw(l,r)$ 对 $2^{32}$ 取模的值。 否则,令 `Sd` 初值为 $tp$,`Cnt` 初值为 $0$,先使用函数 `GetA` 依次生成 $a_i$,再使用函数 `GetLR` 依次生成 $L,R$,具体方式以代码形式后附。

输出格式


若 $tp=0$ 则输出 $q$ 行,每行一个正整数,表示该询问的答案。 否则,令 $ans_i$ 为第 $i$ 次询问的答案,你需要输出 $(ans_i\times i)\bmod 2^{32}$ 的**按位异或和**。

输入输出样例

输入样例 #1

3 2 0
100
3 1 2
1 3
2 3

输出样例 #1

2
0

输入样例 #2

5 2 0
10100
2 7 6 3 5
1 5
2 4

输出样例 #2

8
4

输入样例 #3

20 100 8551679995685981130
11001000000000000000

输出样例 #3

1673

说明

#### 【样例解释 #1】 只有 $w(1,1)=w(1,2)=1$。 对于区间 $[1,3]$,如果『奕』选第一个数,则『博』选后两个数,否则『博』不选,于是『博』获胜。 注意是从左往右依次选取,『博』在选后两个数之前能够知道『奕』是否选了第一个数。 #### 【样例解释 #2】 只有 $w(1,1)=w(1,2)=w(1,3)=w(1,4)=w(2,3)=w(2,4)=w(3,3)=w(3,4)=1$。 #### 【样例解释 #3】 由于本样例 $tp\ne 0$,所以你需要使用特殊方式输入输出。 #### 【数据范围】 对于所有数据,$1\le n\le5\times10^5,1\le q\le 1.5\times10^6,0<a_i<2^{60},1\le L\le R\le n,0\le tp<2^{64}$。 | 子任务编号 | 分值 | $n\le$ | $q\le$ | $tp$ | $a_i<$ | 特殊性质 | | :--------: | :--: | :-----------: | :-------------: | :----: | :------: | :------: | | $1$ | $6$ | $20$ | $100$ | $=0$ | $2^{60}$ | 有 | | $2$ | $7$ | $100$ | $10^3$ | $=0$ | $2^{10}$ | 有 | | $3$ | $8$ | $700$ | $10^3$ | $=0$ | $2^{10}$ | 无 | | $4$ | $9$ | $3000$ | $10^5$ | $=0$ | $2^{60}$ | 无 | | $5$ | $14$ | $3\times10^4$ | $10^5$ | $=0$ | $2^{20}$ | 无 | | $6$ | $17$ | $2\times10^5$ | $1.5\times10^6$ | $\ge1$ | $2^{60}$ | 有 | | $7$ | $19$ | $5\times10^5$ | $1.5\times10^6$ | $\ge1$ | $2^{60}$ | 有 | | $8$ | $20$ | $5\times10^5$ | $1.5\times10^6$ | $\ge1$ | $2^{60}$ | 无 | 特殊性质:序列 $b_i$ 中最多有 $10$ 个 $0$。 #### 【备注】 数据生成方式: ```cpp using ul=unsigned long long; using ui=unsigned int; ui Ans,ans; ul Sd,Cnt; ul Rd(){Sd^=Sd<<19,Sd^=Sd>>12,Sd^=Sd<<29;return Sd^=++Cnt;} void GetA(ul &a){a=Rd()%((1ull<<60)-2)+1;} void GetLR(int &l,int &r){ l=Rd()%n+1,r=Rd()%n+1; if(l>r)swap(l,r); } int main(){ //read n,q,tp,b[i] if(tp){ Sd=tp,Cnt=0; for(int i=1;i<=n;++i)GetA(a[i]); for(int qi=1;qi<=q;++qi){ GetLR(l,r); //sol Ans^=ans*qi; } printf("%u\n",Ans); } } ```