CF1746F Kazaee
prologue
数组范围一定要看好了开,不然容易我一样,调试调了一页多。
还有就是不要傻乎乎地只跑一次和哈希,因为和哈希(从下面地佬的题解中才知道)它其实算作是一种 trick(类比SA(Stimulate_anneal)。
analysis
这个题目的第二个询问时询问一个区间里面出现过的正整数的次数是否为 \(k\) 的倍数。这个题可以说是这个题目的 pro plus 版本。这样子的话么,我们就可以往这个方面考虑。
我们再继续分析这个题目。
我们和上面所示的例题一样,将统计出现次数,哈希一下。
然后,我们记 \(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;
}
随机推荐
- tvm relay IR 可视化
本文地址: https://www.cnblogs.com/wanger-sjtu/p/16819877.html 发现最近relay 的可视化已经在tvm主线上支持了,这里有一个简单的demo代码记 ...
- 从头学Java17-Modules模块
模块Modules 了解module系统如何塑造 JDK,如何使用,使项目更易于维护. 烧哥注 从头讲JDK17的文章比较少,英文为主,老外虽能讲清原理,但写的比较绕,所以决定翻译一下,也有个别细节完 ...
- 五分钟了解MES与MOM的区别和联系
大家好,我是Edison. 上一篇,我们通过了解了MES系统的发展历程和标准体系.本篇,我们来快速了解一下近年来吵得很热的MOM是什么鬼,它和MES到底有什么区别和联系. MES是什么 MES (Ma ...
- List去除重复数据的五种方式
来自:CSDN,作者:多纤果冻 链接:https://blog.csdn.net/qq_37939251/article/details/90713643 以下介绍五种-不同的方法去除 Java 中A ...
- 博客代码托管网站个人体会及感受(GitHub、Coding、Netlity、阿里云弹性web托管)
GitHub 免费 部署 github上,服务器在国外,访问速度一般,稳定性比较好,网站知名,操作方便,部署简单,域名不需要备案. Coding 免费 coding 支持 PHP + mysql 的动 ...
- C语言基础--数组详细说明
目录 一.什么是数组 二.一维数组 1.一维数组创建 2.一维数组的使用 2.1 索引值 2.2 遍历数组 2.3 如何使用sizeof()计算出数组的长度 三.二维数组 1.二维数组的创建 2.二维 ...
- CentOS上安装Redis的两种方式
今天小编给大家介绍下,如何在CentOS上安装Redis.通常有两种方式:第一种是通过下载源码并编译来安装,第二种是通过仓库直接安装.相较而言,第二种方式更直截了当,但小编更倾向第一种. 一.通过源码 ...
- Redis持久化机制 RDB、AOF、混合持久化详解!如何选择?
本文已经收录进 JavaGuide(「Java学习+面试指南」一份涵盖大部分 Java 程序员所需要掌握的核心知识.) Redis 持久化机制属于后端面试超高频的面试知识点,老生常谈了,需要重点花时间 ...
- pandas 格式化日期
output_data["ShipDate"] = output_data["ShipDate"].dt.strftime("%Y/%m/%d&quo ...
- 论文解读(PERL)《PERL: Pivot-based Domain Adaptation for Pre-trained Deep Contextualized Embedding Models》
Note:[ wechat:Y466551 | 可加勿骚扰,付费咨询 ] 论文信息 论文标题:PERL: Pivot-based Domain Adaptation for Pre-trained D ...