2020 CCPC 长春 K. Ragdoll(预处理+启发式合并)
发布日期:2021-06-30 10:33:30
浏览次数:2
分类:技术文章
本文共 1927 字,大约阅读时间需要 6 分钟。
考虑 x ⊕ y = g c d ( x , y ) x\oplus y=gcd(x,y) x⊕y=gcd(x,y)的情况应该是非常少的
不妨设 x > y x>y x>y
由于 x ⊕ y > = x − y > = g c d ( x , y ) x\oplus y>=x-y>=gcd(x,y) x⊕y>=x−y>=gcd(x,y)
显然等号应该同时取到,得到 x ⊕ y = x − y = g c d ( x , y ) x\oplus y=x-y=gcd(x,y) x⊕y=x−y=gcd(x,y)
枚举约数 k k k作为 g c d ( x , y ) gcd(x,y) gcd(x,y)
那么 x , y x,y x,y一定是 k k k的倍数,所以可以枚举 k k k的倍数作为 y y y
如果满足上面那个 x , y x,y x,y的关系就是合法的关系,把这些关系存起来
显然预处理这些关系的复杂度是调和级数的复杂度
那么现在只需要对一个集合维护一个桶即可
修改集合内某个点的点权,只需要枚举这个点权可能的关系即可,直接从桶里面取数
合并两个集合,使用启发式合并,小的合并到大的上面
然后桶数组也累加
#includeusing namespace std;const int maxn = 3e5+10;vector rule[maxn];int n,m;int gcd(int a,int b){ return b==0?a:gcd(b,a%b); }void init(int mx){ for(int i=1;i<=mx;i++) for(int j=i;j+i<=mx;j+=i) { int y = j, x = j+i; if( (x^y)==x-y && x-y==gcd(x,y) ) { rule[x].push_back( y ); rule[y].push_back( x ); } }}int fa[maxn],siz[maxn],val[maxn];long long ans;int find(int x){ return x==fa[x]?x:fa[x]=find(fa[x]); }unordered_map mp[maxn];vector vec[maxn];void join(int x,int y){ int fl = find( x ), fr = find( y ); if( fl==fr ) return; if( siz[fl]>siz[fr] ) swap(fl,fr);// if( mp[fl].size()>mp[fr].size() ) swap(fl,fr); for(auto v:mp[fl] ) for(auto r:rule[v.first] ) if( mp[fr].count(r) ) ans += 1ll*v.second*mp[fr][r]; for(auto v:mp[fl] ) mp[fr][v.first] += v.second; mp[fl].clear(); siz[fr] += siz[fl], fa[fl] = fr;}int main(){ init(200000); cin >> n >> m; for(int i=1;i<=n;i++) { scanf("%d",&val[i] ); fa[i] = i, siz[i] = 1, mp[i][val[i]]++; } while( m-- ) { int type,x,y; scanf("%d%d%d",&type,&x,&y); if( type==1 ) siz[x] = 1, fa[x] = x, val[x] = y, mp[x][val[x]]++; else if( type==2 ) join(x,y); else { //把节点x的权值修改为y int zu = find( x ); mp[zu][val[x]]--; for(auto v:rule[val[x]] ) ans -= mp[zu][v]; val[x] = y; for(auto v:rule[val[x]] ) ans += mp[zu][v]; mp[zu][val[x]]++; } printf("%lld\n",ans); }}
转载地址:https://issue-is-vegetable.blog.csdn.net/article/details/117235121 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2024年04月24日 07时28分23秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
javascript 之 模拟new关键字的功能
2019-04-30
JavaScript深入之call和apply的模拟实现
2019-04-30
javaScript手撕代码之leetcode-最大正方形
2019-04-30
Vue之单向数据流
2019-04-30
ES6之深入Set 与 WeakSet的知识讲解
2019-04-30
算法之链表的逆转
2019-04-30
Set 和 Array 玩转 交/并/差集
2021-07-03
javaScript之事件模型,你知道多少?
2021-07-03
Vue2.0:双向数据绑定 之 监听对象,源码分析
2021-07-03
浅析:正则表达式修改字符串数字“10000”为“10,000”
2021-07-03
浅析chrome新特性,追溯源头至HSTS
2021-07-03
什么是Chrome稳定版,Beta版,Dev版和Canary版发布渠道?(转载)
2019-04-30
如何理解ES6 静态编译?
2019-04-30
TC39、ECMA-262、ECMAScript 的一些事儿
2019-04-30
对 && 和 || 这两个逻辑运算符进行一个深入的理解
2019-04-30
margin塌陷 和 margin合并 两个BUG
2019-04-30
javascript:null undefined 和 NaN 的区别
2019-04-30
javascript之 var,let, const之间的异同
2019-04-30