prologue

数组范围一定要看好了开,不然容易我一样,调试调了一页多。

还有就是不要傻乎乎地只跑一次和哈希,因为和哈希(从下面地佬的题解中才知道)它其实算作是一种 trick(类比SA(Stimulate_anneal)。

analysis

这个题目的第二个询问时询问一个区间里面出现过的正整数的次数是否为 \(k\) 的倍数。这个题可以说是这个题目的 pro plus 版本。这样子的话么,我们就可以往这个方面考虑。

我们再继续分析这个题目。

我们和上面所示的例题一样,将统计出现次数,哈希一下。

然后,我们记 \(G(l, r)\) 为一个区间里面的数字哈希和,如果满足题目中的性质,那么我们会有:

\[k \mid G(l, r)
\]

证明:取其中的一个数 \(a_i\) 为例,出现了 \(k\) 次则相加和一定为 \(k\) 的

\(a_i\)倍数。对于满足条件的 \(G(l, r)\) 其中每一个数都满足条件,由此得证。

最后我们就转化成了给每一个数字的哈希值求和,然后看这个值能否整除 \(k\)。

还有就是对于这个里面的时候进行离散化要考虑好常数问题,然后选择合适的方法进行离散化。

然后我们分析一下正确性,对于一个区间限制最坏的情况是存在一对数 \((x, y)\),满足 \(k \mid cnt_x + cnt_y, k \nmid cnt_x, k\nmid cnt_y\) 那么这个时候我们判断错误当且仅当 \((x, y)\) 全被选,或者 \((x, y)\) 全不选。我们随机判错的概率是 \(\frac{1}{2}\),所以当我们进行了 \(B\) 次判断,我们判错的概率就是 \(\frac{1}{2^B}\),这个时候取到 \(B = 30\) 即可。

code time

#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define rl register ll
#define lowbit(x) (x & -x)
mt19937 rnd; // 一个很好用的随机化,与rand相比这个会更快一点,听别的题解们说不用这个会被卡/fad template <class T> // 快读板子 inline void read(T &res)
{
char ch; bool f = 0 ;
while((ch = getchar()) < '0' || ch > '9') f |= ch == '-';
res = ch ^ 48;
while((ch = getchar()) <= '9' && ch >= '0') res = (res << 1) + (res << 3) + (ch ^ 48);
res = f ? ~res + 1 : res;
} const ll N = 3e5 + 10; ll n, a[N], m, lst[N]; ll tr[N], ls[N << 2], tot, rd[N << 2]; // 想好数组大小 bool ans[N]; struct node
{
ll op, x, y, z;
}q[N << 1]; inline ll Rand(ll l, ll r)
{
uniform_int_distribution<ll>distribution(l, r);
return distribution(rnd);
} inline void add(ll x, ll c)
{
for(; x <= n; x += lowbit(x)) tr[x] += c;
} inline ll sum(ll x)
{
ll res = 0;
for(; x; x -= lowbit(x)) res += tr[x];
return res;
} int main()
{
// freopen("1.in", "r", stdin), freopen("1.out", "w", stdout); read(n), read(m); for(rl i=1; i <= n; ++ i)
{
read(a[i]);
ls[ ++ tot] = a[i];
} for(rl i=1; i <= m; ++ i)
{
read(q[i].op), read(q[i].x), read(q[i].y);
if(q[i].op == 1) ls[ ++ tot] = q[i].y;
else read(q[i].z);
} sort(ls + 1, ls + 1 + tot); tot = unique(ls + 1, ls + 1 + tot) - ls - 1; for(rl i=1; i <= n; ++ i) a[i] = lower_bound(ls + 1, ls + 1 + tot, a[i]) - ls; for(rl i=1; i <= m; ++ i) if(q[i].op == 1) q[i].y = lower_bound(ls + 1, ls + 1 + tot, q[i].y) - ls; memset(ans, 1, sizeof ans); for(rl i=0; i < 30; ++ i)
{
memset(tr, 0, sizeof tr);
for(rl i=1; i <= tot; ++ i) rd[i] = Rand(1, 1e9);
for(rl i=1; i <= n; ++ i) lst[i] = a[i];
for(rl i=1; i <= n; ++ i) add(i, rd[a[i]]);
for(rl i=1; i <= m; ++ i)
{
if(q[i].op == 1)
{
add(q[i].x, -rd[lst[q[i].x]]);
lst[q[i].x] = q[i].y;
add(q[i].x, rd[lst[q[i].x]]);
}
else ans[i] &= ((sum(q[i].y) - sum(q[i].x - 1)) % q[i].z == 0);
}
} for(rl i=1; i <= m; ++ i) if(q[i].op == 2) (ans[i] == 1) ? puts("YES") : puts("NO");
return 0;
}

随机推荐

  1. Containerd组件 —— containerd-shim-runc-v2作用

    1.概述 通过<浅析开源容器标准--OCI>.<浅析容器运行时>和<浅析Kubernetes CRI>这三篇博文我们了解了容器标准OCI.容器运行时以及Kubern ...

  2. Unity中的PostProcessBuild:深入解析与实用案例

    Unity中的PostProcessBuild:深入解析与实用案例 在Unity游戏开发中,我们经常需要在构建完成后对生成的应用程序进行一些额外的处理.这时,我们可以使用Unity提供的PostPro ...

  3. python笔记:第三章使用字符串

    1.1 字符串的基本操作 对序列的操作都适用于字符串,但字符串是不可变的,所以元素赋值和切片赋值都是非法的 1.2 设置字符串的格式 方法一: 使用%来设置字符串 format = 'Hello, % ...

  4. Failed to connect to 127.0.0.1 port 1080: Connection refused拒绝连接错误

    一.git拒绝连接原因分析 使用git从远程仓库下载代码出现上述的错误是因为使用了proxy代理,所以要解决该问题,核心操作就是要取消代理 二.解决方式 1.查看Linux当前有没有使用代理 通过gi ...

  5. maven项目创建后添加resources等文件夹

    maven项目初始化只生成src/main/resources目录,但是这个不够用,我们得创建 src/main/java目录 src/test/java目录 src/test/resources目录 ...

  6. C标准库 操作文件

    C标准库 操作文件 数据持久化的两种方法:文件和数据库 文本文件和二进制文件 举个例子,写C++的代码,源代码为文本文件.编译出来的可执行文件(.exe)文件是二进制文件 文本文件 以文本的编码(AS ...

  7. 【Azure API Management】实现在API Management服务中使用MI(管理标识 Managed Identity)访问启用防火墙的Storage Account

    问题描述 在Azure的同一数据中心,API Management访问启用了防火墙的Storage Account,并且把APIM的公网IP地址设置在白名单.但访问依旧是403 原因是: 存储帐户部署 ...

  8. 巧用 awk 批量杀进程

    今天遇到线上的一个问题: 我需要批量杀死某台机器的 PHP 进程,该怎么办? 注意,不是 php-fpm,是常驻任务. 如果是一个进程,那就好办了,ps -ef | grep php,找到 PID 然 ...

  9. mysql中使用sql语句统计日志计算每天的访问量

    日志建表语句: CREATE TABLE `syslog` ( `syslogid` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(255) ...

  10. 2021-4-19 vs加速启动小技巧之intellitrace

    在选项界面中将intellitrace的启用关闭后对于程序的打开有加速作用.