acm -(并查集、启发式合并、gcd、枚举因子)2020 China Collegiate Programming Contest Changchun Onsite K. Ragdoll
传送门
本题考虑直接对每个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相关推荐
- upc-WNJXYK and DIDIDI and monkey(并查集启发式合并)
题目描述 DIDIDI and WNJXYK are good friends. One day, they go to the zoo. The monkeys are playing happil ...
- codeforces1559 D2. Mocha and Diana (Hard Version)(并查集+启发式合并+随机化)
D2. Mocha and Diana (Hard Version) RunningBeef题解 首先将图1的点与1号点所在的连通块相连,图2类似. 然后就是在图1和图2中选择没有和1号点在同一个连通 ...
- 2018.08.21 bzoj4668: 冷战(并查集+启发式合并)
传送门 可以发现需要维护连通性和两点连通时间. 前者显然是并查集的常规操作,关键就在于如何维护两点的连通时间. 然后会想到这个时候不能用路径压缩了,因为它会破坏原本树形集合的结构,因此可以启发式按si ...
- codeforces#1166F. Vicky's Delivery (Service并查集+启发式合并)
题目链接: https://codeforces.com/contest/1166/problem/F 题意: 给出节点数为$n$,边数为$m$的图,保证每个点对都是互连的 定义彩虹路:这条路经过$k ...
- P7323-[WC2021]括号路径【并查集,启发式合并】
正题 题目链接:https://www.luogu.com.cn/problem/P7323 题目大意 给出nnn个点的一张有向图.每个边(u,v,w)(u,v,w)(u,v,w)表示u−>vu ...
- 51nod 1515 明辨是非 2017百度之星初赛第一场第二题(并查集+启发式合并)
题目: 原题链接 给n组操作,每组操作形式为x y p. 当p为1时,如果第x变量和第y个变量可以相等,则输出YES,并限制他们相等:否则输出NO,并忽略此次操作. 当p为0时,如果第x变量和第y个变 ...
- 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 ...
- 2019组队赛第二场(ACM International Collegiate Programming Contest, Arabella Collegiate 解题报告 Apare_xzc
2019组队赛第二场(ACM International Collegiate Programming Contest, Arabella Collegiate 解题报告 by xzc,zx,lj 先 ...
- 采用Kruskal算法生成最小生成树,并采用并查集的合并优化和查询优化。
文章目录 最小生成树 1.什么是图的最小生成树(MST)? 2.最小生成树用来解决什么问题? Kruskal(克鲁斯卡尔)算法 算法描述 图解 最小生成树 1.什么是图的最小生成树(MST)? 用N- ...
最新文章
- spark 资源参数调优
- deepin20自带c语言,deepin 20.1终于找到你-国产操作系统deepin之初体验
- 极域电子教室卸载、忘记密码解决方案
- 能源巨头BP称已经测试了“内部”代币
- Linux安装pyaudio
- 由NTC电阻值 计算温度 C语言,NTC热敏电阻温度计算方法,Steinhart-Hart方程和B值法(转)...
- linux病毒扫描工具,linux病毒扫描工具ClamAV使用
- django-上下文处理器
- 情绪满盈,心猿似马,人生80%的时间都在自我内耗
- 华为#S系列交换机和E系列交换机基于IP网段配置限速
- 如何在ORACLE数据库的字段上建立索引?
- js如何实现四舍五入 Math.round()
- 并非所有投资都同样贬值:数字资产的恢复期
- 验证用户名重复注册PHP
- 端口映射工具PortTunnel
- 【IDL】使用IDL对Landsat系列进行批量水体提取
- 视觉和Lidar里程计
- Python双引号与单引号的使用
- 2023年蓝队初级护网总结
- vue里使用pdf.js实现pdf文件的预览功能