• 题意:有\(n\)列,有\(T\)条指令,若指令格式为\(M\),则将第\(i\)号的所有战舰移到第\(j\)号所在列的后面,若指令格式为\(C\),询问\(i\)和\(j\)是否在同一列,如果在,问他们之间隔了多少战舰.

  • 题解:带权并查集的模板题,\(d\)数组表示某个节点到祖先的距离,\(s\)数组表示集合的子节点个数,当进行合并时,我们可以让\(i\)的祖先到另外一个集合的祖先距离为\(s[fb]\),即\(d[fa]=s[fb]\),然后\(j\)所在集合的元素个数增加,\(s[fb]+=s[fa]\),然后合并即可.我们在\(find\)函数压缩路径时,要把每个点到祖先路径上的边权累加起来,如果并查集的原理你理解的话,这里并不难想.最后查询距离的时候要记得用和\(0\)取个最大值即可.

  • 代码:

    int n;
    int p[N],s[N],d[N]; int find(int x){
    if(p[x]!=x){
    int root=find(p[x]);
    d[x]+=d[p[x]];
    p[x]=root;
    }
    return p[x];
    } int main() {
    ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    cin>>n;
    rep(i,1,30010){
    p[i]=i;
    s[i]=1;
    }
    rep(i,1,n){
    char op;
    int a,b;
    cin>>op>>a>>b;
    if(op=='M'){
    int fa=find(a);
    int fb=find(b);
    d[fa]=s[fb];
    s[fb]+=s[fa];
    p[fa]=fb;
    }
    else{
    int fa=find(a);
    int fb=find(b);
    if(fa!=fb) cout<<-1<<'\n';
    else cout<<max(0,abs(d[b]-d[a])-1)<<'\n';
    }
    } return 0;
    }

最新文章

  1. windows 64位 安装apache+php+mysql
  2. css3的基本样式
  3. 《将博客搬至CSDN》
  4. VS2010安装帮助文档出现错误
  5. 树莓派 config.txt
  6. 列出zip文件内全部内容 当前目录下的所有文件压缩成zip格式的文件(file.zip)
  7. 修改开机启动等待时间(for Ubuntu12.10)
  8. order by 指定顺序 mysql
  9. [Hadoop 周边] Hadoop技术生态圈
  10. WP8_当滚动到滚动条的70%时,自动加载数据效果实现
  11. mysql 执行流程
  12. Asp.Net中的获取Web.config中设置的参数!(前后台的代码示例)
  13. cocos2d-x游戏开发 跑酷(两) 物理世界
  14. [Android开发Tips]Bean的定义
  15. ajax面试汇总
  16. Python之Django rest_Framework(2)
  17. Java Scanner 类
  18. js 获取二级域名
  19. Spring中的接口BeanFactory和FactoryBean的学习
  20. 20165205 2017-2018-2 《Java程序设计》课程总结

热门文章

  1. 详细的String源码解析
  2. kubernets之pv以及pvc
  3. 学习Java第三天
  4. 性能测试WAS内存使用的探索和分析
  5. Mybatis plus通用字段自动填充的最佳实践总结
  6. mysqldump导出数据库导入数据库
  7. IDEA SSM+MAVEN+JWT 图书管理系统
  8. Trove自动钓鱼脚本(国际服
  9. Vim配置及其他注意事项
  10. Android第一代壳demo编写