传送门
本题考虑直接对每个iii求出所有满足ij=gcd(i,j)i^j=gcd(i,j)ij=gcd(i,j)的jjj,然后存在ggg数组中,对于查询修改操作维护一个并查集即可,合并的时候采用启发式合并(小的往大的上合)

核心问题在于如何初始化ggg数组,考虑到每个数的因子其实不多,不妨枚举因子即可,假设枚举的因子为ddd,a=kda=kda=kd,那么b=axordb=a\,xor\,db=axord,然后检验一下是否满足gcd(a,b)=dgcd(a,b)=dgcd(a,b)=d即可,预处理复杂度为O(nlog2n)O(nlog^2n)O(nlog2n)。

int fa[maxn],a[maxn],sz[maxn];
vector<int>g[maxm];
unordered_map<int,int>cnt[maxn];
ll ans=0;
int fd(int rt){return rt==fa[rt]?rt:(fa[rt]=fd(fa[rt]));
}
int main(){FOR(i,1,maxm){for(register int j=i;j<maxm;j+=i){if((j^i)>=maxm || !(j^i) || (j^i)>=maxm)continue;if(__gcd(j,j^i)==i){g[j].push_back(j^i);}}}int n=rd(),m=rd();FOR(i,1,n+1){a[i]=rd();fa[i]=i;cnt[i][a[i]]++;sz[i]=1;}while(m--){int t=rd();if(t==1){int x=rd(),v=rd();fa[x]=x;cnt[x][v]++;sz[x]=1;a[x]=v;}else if(t==2){int x=rd(),y=rd();int fx=fd(x),fy=fd(y);if(fx!=fy){if(sz[fx]>sz[fy])swap(fx,fy);unordered_map<int,int>::iterator it1;for(it1=cnt[fx].begin();it1!=cnt[fx].end();++it1){FOR(i,0,g[it1->first].size()){if(cnt[fy].count(g[it1->first][i]))ans+=1ll*it1->second*cnt[fy][g[it1->first][i]];}}for(it1=cnt[fx].begin();it1!=cnt[fx].end();++it1)cnt[fy][it1->first]+=it1->second;cnt[fx].clear();sz[fy]+=sz[fx];fa[fx]=fy;}}else{int x=rd(),v=rd();int fx=fd(x);FOR(i,0,g[a[x]].size()){ans-=cnt[fx][g[a[x]][i]];}cnt[fx][a[x]]--;a[x]=v;FOR(i,0,g[v].size()){ans+=cnt[fx][g[v][i]];}cnt[fx][v]++;}printf("%lld\n",ans);}
}

acm -(并查集、启发式合并、gcd、枚举因子)2020 China Collegiate Programming Contest Changchun Onsite K. Ragdoll相关推荐

  1. upc-WNJXYK and DIDIDI and monkey(并查集启发式合并)

    题目描述 DIDIDI and WNJXYK are good friends. One day, they go to the zoo. The monkeys are playing happil ...

  2. codeforces1559 D2. Mocha and Diana (Hard Version)(并查集+启发式合并+随机化)

    D2. Mocha and Diana (Hard Version) RunningBeef题解 首先将图1的点与1号点所在的连通块相连,图2类似. 然后就是在图1和图2中选择没有和1号点在同一个连通 ...

  3. 2018.08.21 bzoj4668: 冷战(并查集+启发式合并)

    传送门 可以发现需要维护连通性和两点连通时间. 前者显然是并查集的常规操作,关键就在于如何维护两点的连通时间. 然后会想到这个时候不能用路径压缩了,因为它会破坏原本树形集合的结构,因此可以启发式按si ...

  4. codeforces#1166F. Vicky's Delivery (Service并查集+启发式合并)

    题目链接: https://codeforces.com/contest/1166/problem/F 题意: 给出节点数为$n$,边数为$m$的图,保证每个点对都是互连的 定义彩虹路:这条路经过$k ...

  5. P7323-[WC2021]括号路径【并查集,启发式合并】

    正题 题目链接:https://www.luogu.com.cn/problem/P7323 题目大意 给出nnn个点的一张有向图.每个边(u,v,w)(u,v,w)(u,v,w)表示u−>vu ...

  6. 51nod 1515 明辨是非 2017百度之星初赛第一场第二题(并查集+启发式合并)

    题目: 原题链接 给n组操作,每组操作形式为x y p. 当p为1时,如果第x变量和第y个变量可以相等,则输出YES,并限制他们相等:否则输出NO,并忽略此次操作. 当p为0时,如果第x变量和第y个变 ...

  7. 2015 ACM Arabella Collegiate Programming Contest(F题)

    F. Palindrome [ Color: Pink ] A string is palindrome if it can be read the same way in either direct ...

  8. 2019组队赛第二场(ACM International Collegiate Programming Contest, Arabella Collegiate 解题报告 Apare_xzc

    2019组队赛第二场(ACM International Collegiate Programming Contest, Arabella Collegiate 解题报告 by xzc,zx,lj 先 ...

  9. 采用Kruskal算法生成最小生成树,并采用并查集的合并优化和查询优化。

    文章目录 最小生成树 1.什么是图的最小生成树(MST)? 2.最小生成树用来解决什么问题? Kruskal(克鲁斯卡尔)算法 算法描述 图解 最小生成树 1.什么是图的最小生成树(MST)? 用N- ...

最新文章

  1. spark 资源参数调优
  2. deepin20自带c语言,deepin 20.1终于找到你-国产操作系统deepin之初体验
  3. 极域电子教室卸载、忘记密码解决方案
  4. 能源巨头BP称已经测试了“内部”代币
  5. Linux安装pyaudio
  6. 由NTC电阻值 计算温度 C语言,NTC热敏电阻温度计算方法,Steinhart-Hart方程和B值法(转)...
  7. linux病毒扫描工具,linux病毒扫描工具ClamAV使用
  8. django-上下文处理器
  9. 情绪满盈,心猿似马,人生80%的时间都在自我内耗
  10. 华为#S系列交换机和E系列交换机基于IP网段配置限速
  11. 如何在ORACLE数据库的字段上建立索引?
  12. js如何实现四舍五入 Math.round()
  13. 并非所有投资都同样贬值:数字资产的恢复期
  14. 验证用户名重复注册PHP
  15. 端口映射工具PortTunnel
  16. 【IDL】使用IDL对Landsat系列进行批量水体提取
  17. 视觉和Lidar里程计
  18. Python双引号与单引号的使用
  19. 2023年蓝队初级护网总结
  20. vue里使用pdf.js实现pdf文件的预览功能

热门文章

  1. 保健常识——生物钟规律 1
  2. 谷歌和火狐浏览器下的input的padding不同表现
  3. iOS开发:使用 Sign In With Apple(登录)用法以及注意事项
  4. 适合零售业的财务软件有哪些?这5款零售财务软件不能错过!
  5. 和程序员大叔谈恋爱的甜甜甜甜甜 | 程序员有话说
  6. Python英超联赛10年数据爬虫
  7. python数组冒泡排序法_python 冒泡排序法
  8. 使用OpenCV、Keras和TensorFlow进行微笑检测
  9. 最经典幽默短信大收藏
  10. genymotion的安装和使用