题解 Codeforces 1746F Kazaee
题意
给定长度为 的数组 ,和 次操作,支持:
- 给定 ,修改 为
- 给定 ,查询 中是否每个数的出现次数都是 的倍数
题解
构造随机映射 ,那么区间的 和是 的倍数是答案为 YES 的必要条件。我们注意到区间和模 随机,这意味着我们有 的概率误判,那么我们构造 个不同的随机映射,答案为 YES 当且仅当每个随机映射中 和都是 的倍数,此时错误率为 ,取 时单组数据错误率约为 ,可以接受。
修改操作用树状数组维护即可。
# include <bits/stdc++.h>
const int N=300010,INF=0x3f3f3f3f,B=25;
int n,m;
int a[N];
typedef long long ll;
std::map <int,int> mp;
int cnt;
inline int mpc(int x){
if(!x) return 0;
if(!mp[x]) mp[x]=++cnt;
return mp[x];
}
std::mt19937 rng(time(0));
struct bit{
int b[N*2];
ll s[N];
inline void init(void){
for(int i=1;i<=n+m;++i) b[i]=rng();
return;
}
inline int lowbit(int x){
return x&(-x);
}
inline void add(int x,int v){
for(;x<=n;x+=lowbit(x)) s[x]+=v;
return;
}
inline int query(int l,int r,int k){
ll ans=0;
--l;
for(;l;l-=lowbit(l)) ans-=s[l];
for(;r;r-=lowbit(r)) ans+=s[r];
return ans%k;
}
inline void modify(int x,int pre,int nex){
add(x,-b[pre]),add(x,b[nex]);
return;
}
}ch[41];
inline int read(void){
int res,f=1;
char c;
while((c=getchar())<'0'||c>'9')
if(c=='-')f=-1;
res=c-48;
while((c=getchar())>='0'&&c<='9')
res=res*10+c-48;
return res*f;
}
inline void modify(int x,int v){
int pre=mpc(a[x]),nex=mpc(v);
a[x]=v;
for(int i=1;i<=B;++i) ch[i].modify(x,pre,nex);
return;
}
inline int query(int l,int r,int k){
for(int i=1;i<=B;++i) if(ch[i].query(l,r,k)) return 0;
return 1;
}
int main(void){
n=read(),m=read();
for(int i=1;i<=B;++i) ch[i].init();
for(int i=1;i<=n;++i) modify(i,read());
while(m--){
int op=read(),l=read(),r=read();
if(op==2) puts(query(l,r,read())?"YES":"NO");
else modify(l,r);
}
return 0;
}
作者:Meatherm
出处:https://www.cnblogs.com/Meatherm/p/17153752.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
标签:
Codeforces
, 随机化
Buy me a cup of coffee ☕.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现