小博的最大和最小值
该比赛已结束,您无法在比赛模式下递交该题目。您可以点击“在题库中打开”以普通模式查看和递交本题。
题目描述
给定长度为 的序列 。
次询问,每次给出四个正整数 $L_1,R_1,L_2,R_2\ (1\le L_1\le R_1\le 4000,1\le L_2\le R_2\le 4000)$,问有多少个区间 满足 中的最大值属于 、最小值属于 。
询问次数很大,所以询问是在程序内生成的。请自行阅读提示说明一栏的代码。
输入格式
第一行两个正整数 。
接下来一行 个正整数 。
接下来一行三个正整数 ,为数据生成器的参数。你不需要理解数据生成器具体的运行过程,你只需要知道,如果正确生成了询问的话,一定有 。
输出格式
设第 个询问的答案为 。输出一行一个整数,为 的值。
5 5
2 4 1 3 5
1 5 1145141919810
24
10 20000000
1 3 4 10 5 5 2 7 10 7
1 10 23333333333333333
548722417
提示
样例 1 解释
五次询问的 分别为 ,答案分别为 。
输出 $(1\times 15)\ \mathrm{xor}\ (2\times 1)\ \mathrm{xor}\ (3\times 1)\ \mathrm{xor}\ (4\times 2)\ \mathrm{xor}\ (5\times 6)=24$。
样例程序
下面是我们提供的样例程序,你可以直接以其为基础编写你的程序。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
namespace Generator{
typedef unsigned long long ull;
typedef __uint128_t L;
ull seed;
int p,q;
struct FastMod {
ull b, m;
FastMod(ull b) : b(b), m(ull((L(1) << 64) / b)) {}
ull reduce(ull a) {
ull q = (ull)((L(m) * a) >> 64);
ull r = a - q * b; // can be proven that 0 <= r < 2*b
return r >= b ? r - b : r;
}
}F(2);
void init(){
cin>>p>>q>>seed;//读入 p,q,seed
assert(p!=q);
F=FastMod(q-p+1);
}
unsigned long long rd () {
seed ^= (seed << 13);
seed ^= (seed >> 7);
seed ^= (seed << 17);
return seed;
}
void getlr(int &l1,int &r1,int &l2,int &r2){
//将 l1,r1,l2,r2 作为参数传入,即可得到一组询问
l1=F.reduce(rd())+p;
r1=F.reduce(rd())+p;
l2=F.reduce(rd())+p;
r2=F.reduce(rd())+p;
if(l1>r1)swap(l1,r1);
if(l2>r2)swap(l2,r2);
}
}
int n,m,a[100005];
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
Generator::init();
long long xorsum=0;
for(int i=1,l1,r1,l2,r2;i<=m;i++){
Generator::getlr(l1,r1,l2,r2);
long long ans=/*ans保存你的答案*/;
xorsum^=ans*i;
}
cout<<xorsum;
}
数据范围
本题有四个子任务。子任务一时间限制 秒,其它子任务时间限制 秒。
所有数据均满足:,,,,。
- 子任务 ( 分):。
- 子任务 ( 分):。
- 子任务 ( 分):。
- 子任务 ( 分):无特殊限制。