小Z的神奇数列-题解
题目大意:
给你个数列,再给出「查询最大」「查询最小」「删除数 x 」「求 Max^Min 的值」「求乘积和」这五种操作。
我的做法是维护四个堆,两个大根堆两个小根堆,分别记为 $q, delq$(大根堆)和$p, delp$(小根堆)。
每次删除操作就把要删除的那个数丢进$delq$和$delp$,当$q$与$delq$的堆顶相同时,就一直$pop$,直到堆顶不同,小根堆同理。
这样前三个操作就没了。
第4个操作就是一个快速幂。
主要是操作5,由于毒瘤出题人给的模数不是质数,求逆元必须用$exgcd$,所以维护一个变量sum记录当前的模意义下的乘积,每次删除乘以逆元,遇到操作5直接输出,这题就没了。逆元定义
我给个求逆元的函数,快速幂自己写去吧
int exgcd(int a, int b, int &x, int &y)//这是函数部分
{
if (!b)
{
x = 1, y = 0;
return a;
}
int d = exgcd(b, a % b, x, y), z;
z = x, x = y, y = z - (a / b) * y;
return d;
}
//这是删数部分
int y, d;
exgcd(x, mod, y, d);
sum = sum * ((y + mod) % mod) % mod;
//这是操作5输出部分
printf("%lld\n, &sum);

浙公网安备 33010602011771号