CF1746F Kazaee 题解
CF1746F Kazaee 题解
题目描述
题目解法
看到题目能想到一个相当劣的树状数组做法:先离散化,然后对每个数开个树状数组,每次查询区间内每个数的个数。
这个做法相当劣,修改
好像还有一个
所以就只能考虑乱搞。
我们考虑一个区间
但是上述条件只是一个必要条件,并不是充分条件。
其错误率大概是
考虑随机化。
序列
比如
如果对于所有的
那么判断的错误率就是
实现方法就是开
用结构体和 vector 的树状数组被卡了,请各位注意卡常
Code
#include<bits/stdc++.h> using namespace std; #define maxn 300005 #define i64 long long const int T=30; template< typename T >inline void read(T &x) { char c=getchar();x=0;int f=0; for(;!isdigit(c);c=getchar()) f|=(c=='-'); for(;isdigit(c);c=getchar()) x=((x<<3)+(x<<1)+(c^48)); x=f?-x:x; } template< typename T >inline void write(T x) { if(x<0) putchar('-'),x=-x; if(x>9) write(x/10); putchar(x%10^48); } template< typename T,typename ... Args > inline void read(T &_x, Args &... args) {read(_x), read(args...);} template< typename T,typename ... Args > inline void write(T _x, Args ... args) { write(_x), write(args...);} unordered_map<int, int> hsh; int cnt=0; i64 ta[T][maxn]; int dic[T][maxn<<1]; int val(int x, int t) {return dic[t][hsh.count(x)?(hsh[x]):(hsh[x]=++cnt)];} void modify(int i, int v, int t) {for(;i<maxn;i+=i&-i) ta[t][i]+=v;} i64 __qry(int i, int t) {i64 r=0; for(;i;i-=i&-i) r+=ta[t][i]; return r;} i64 query(int l, int r, int t) {return __qry(r, t)-__qry(l-1, t);} int lis[maxn]; #define rng for(int t=0;t<T;t++) int main() { srand(time(0)); int n,q; read(n, q); rng for(int j=1;j<=n+q;j++) dic[t][j]=j; rng random_shuffle(dic[t]+1, dic[t]+1+n+q); // 赋随机值的方法被卡了,所以用 random_shuffle() for(int i=1;i<=n;i++) { read(lis[i]); rng modify(i, val(lis[i], t), t); } while(q--) { int opt, l, r, k; read(opt); if(opt==1) { read(l, r); rng modify(l, val(r, t)-val(lis[l], t), t); lis[l]=r; } else { read(l, r, k); if((r-l+1)%k) {puts("NO");continue;} int tag=0; rng if(query(l, r, t)%k) {tag=1; break;} puts(tag?"NO":"YES"); } } }
本文作者:Jimmy-LEEE
本文链接:https://www.cnblogs.com/redacted-area/p/18379527
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
分类:
题解
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步