首页 > 其他分享 >题解 Codeforces 1746F Kazaee

题解 Codeforces 1746F Kazaee

时间:2023-02-25 09:23:16浏览次数:29  
标签:25 int 题解 Codeforces leq mp Kazaee 随机

题意

给定长度为 \(n\) 的数组 \(a\),和 \(q\) 次操作,支持:

  • 给定 \(i,x\),修改 \(a_i\) 为 \(x\)
  • 给定 \(l,r,k\),查询 \([l,r]\) 中是否每个数的出现次数都是 \(k\) 的倍数

\(1 \leq n,q \leq 3 \times 10^5,1 \leq a_i,x \leq 10^9,1 \leq k \leq n\)

题解

构造随机映射 \(f(x) \to b_x\),那么区间的 \(b_x\) 和是 \(k\) 的倍数是答案为 YES 的必要条件。我们注意到区间和模 \(k\) 随机,这意味着我们有 \(\dfrac{1}{k} (k \geq 2)\) 的概率误判,那么我们构造 \(25\) 个不同的随机映射,答案为 YES 当且仅当每个随机映射中 \(b_x\) 和都是 \(k\) 的倍数,此时错误率为 \(\dfrac{m}{k^{25}}\),取 \(k=2\) 时单组数据错误率约为 \(0.008\),可以接受。

修改操作用树状数组维护即可。

# 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;
}

标签:25,int,题解,Codeforces,leq,mp,Kazaee,随机
From: https://www.cnblogs.com/liuzongxin/p/17153752.html

相关文章

  • 题解 LOJ P2393 「JOISC 2017 Day 2」门票安排
    题意咕咕咕。题解这题太神了,无限膜拜p_b_p_b,搬运一波题解。首先考虑二分。题意等价于选一些区间进行反转。首先注意到反转的区间两两有交,不然不反转一定更优。设反转......
  • P8822 [传智杯#3 初赛] 课程报名 题解
    题目传送门题目大意有一种课程,初始定价为\(v\)元;每报名\(m\)个学员,课程的定价就要提升\(a\)元,一共有\(n\)个学员报名。解题思路因为一共有\(n\)个学员报名,所......
  • P8717 [蓝桥杯 2020 省 AB2] 成绩分析 题解
    题目传送门题目大意计算\(n\)个人考试的最高分、最低分和平均分。解题思路输入\(n\)个人成绩的同时,计算最大值,最小值和总数。再将总数除以\(n\)算出平均值并保......
  • AtCoder Beginner Contest 285 A-F 题解
    比赛链接A-EdgeChecker2判断y==2x||y==2x+1即可。点击查看代码#include<cstdio>#include<algorithm>#include<cstring>usingnamespacestd;inta......
  • AtCoder Beginner Contest 283 A-F 题解
    A-Power快速幂板子点击查看代码#include<cstdio>#include<algorithm>usingnamespacestd;#defineintlonglongintn,m;intqpow(inta,intb){ intr......
  • CF837D题解
    CF837D题解没有用的话今天晚上在CF题库里随便选题选的,感觉还不错的题。昨天就开始停自习了,但是一直在摆烂(悲,自从上个学期就这样了,非常怀念一年前的机房,风清气正,大家都......
  • THUPC2019 令人难以忘记的题目名称 题解
    首先感性感觉这个东西是比较有循环节的,但这是后话。最后几步一定是差分相同->每个数相同->全为0。不平凡地猜想差分\(k\)次全\(0\)等价于可以\(k\)步胜利。假设......
  • Universial Cup 题解
    开始瞎做题了全部都写了简要题意,题解默认折叠,可以来做做(?UniversialCup官网The1stUniversalCup比赛名称&题解链接题解包含题目QOJlinkCodeforcesGymLin......
  • 题解 北大集训2018 点分治
    题意给定\(n\)个点的树,求点分治方案数,对\(10^9+7\)取模。两种方案不同当且仅当点分树不同。\(1\leqn\leq5000\)题解考虑怎样合并两个点分治方案。如果我们有......
  • history 题解(并查集)
    考虑使用边带权并查集维护点之间的连通性,边权为这条边建立的时间,查询时如果查询时间小于边权则不能通行(巧妙地处理了时间的性质)。由于时间这种东西性质特殊无法路径压缩,所......