原题链接

题意
俄罗斯套娃,给出一个初始状态和终止状态,问至少需要多少步操作才能实现状态转化

贪心做法
如果完全拆掉再重装,答案是p[i]和q[i]中不为0的值的个数。现在要求寻找最小步数,显然要减去一些多余的步数。如果初始的一些链的前端是终止的某一条链的连续的一部分,那么这条链就不用被拆开再连上,这样每一个长度为x的链对答案的贡献就是-2*(x-1),对每条链进行同样的操作之后就是答案

  1. #include <iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<vector>
  6. #define ll long long
  7. #define ull unsigned long long
  8. #define LOCAL
  9.  
  10. using namespace std;
  11. const int maxn=1e5+;
  12. const int inf=0x3f3f3f3f;
  13. const int mod=1e9+;
  14.  
  15. int p[maxn],q[maxn];
  16. int n;
  17. int main(){
  18. scanf("%d",&n);
  19. int vis[maxn];
  20. int ans=;
  21. for(int i=;i<=n;i++){
  22. scanf("%d",&p[i]);
  23. if(p[i]) vis[p[i]]=,ans++;
  24. }
  25. for(int i=;i<=n;i++){
  26. scanf("%d",&q[i]);
  27. if(q[i]) vis[q[i]]=,ans++;
  28. }
  29.  
  30. for(int i=;i<=n;i++){
  31. if(!vis[i]){
  32. int x=i;
  33. while(p[x]&&q[x]&&p[x]==q[x]){
  34. ans-=;
  35. x=p[x];
  36. }
  37. }
  38. }
  39. printf("%d\n",ans);
  40. return ;
  41. }

并查集

只能进行2个操作:
1、 把一个没有父节点的节点作为一个 没有父节点和子节点的节点的子节点,代价为 1;

2、把一个没有父节点的节点的子节点去掉,代价为1;

那么只能对free的节点进行操作,所以当ai!=bi时,要先把ai拆掉,但必须先满足ai为free才能把i变成free,
同理把i插到bi上时也要满足bi节点为free(即该节点没有父节点)。

  1. #include <iostream>
  2. #include <cstdio>
  3.  
  4. using namespace std;
  5. typedef long long LL;
  6. const int MAXN = 1e5 + ;
  7.  
  8. int a[MAXN], b[MAXN], fa;
  9.  
  10. int main()
  11. {
  12. #ifdef LOCAL
  13. freopen("f.txt", "r", stdin);
  14. //freopen("f.out", "w", stdout);
  15. int T = ;
  16. while(T--){
  17. #endif // LOCAL
  18. ios::sync_with_stdio(false); cin.tie();
  19.  
  20. int n, i, ans = , t;
  21. cin >> n;
  22. for(i = ; i <= n; i++){
  23. cin >> a[i];
  24. }
  25. for(i = ; i <= n; i++){
  26. cin >> b[i];
  27. }
  28. for(i = ; i <= n; i++){
  29. if(a[i] == b[i]) continue;
  30. if(a[i] != ){
  31. ans++;
  32. fa = a[i];
  33. a[i] = ;
  34. while(a[fa]){
  35. t = fa;
  36. fa = a[fa];
  37. a[t] = ;
  38. ans++;
  39. }
  40. }
  41. }
  42. for(i = ; i <= n; i++){
  43. if(a[i] == b[i]) continue;
  44. if(b[i] != ){
  45. fa = a[b[i]];
  46. if(fa){
  47. a[b[i]] = ;
  48. ans++;
  49. }
  50. else{
  51. continue;
  52. }
  53. while(a[fa]){
  54. t = fa;
  55. fa = a[fa];
  56. a[t] = ;
  57. ans++;
  58. }
  59. }
  60. }
  61. for(i = ; i <= n; i++){
  62. if(a[i] == b[i]) continue;
  63. ans++;
  64. }
  65. cout << ans << endl;
  66. return ;
  67. }

GYM 101173 F.Free Figurines(贪心||并查集)的更多相关文章

  1. POJ 1456 Supermarket(贪心+并查集)

    题目链接:http://poj.org/problem?id=1456 题目大意:有n件商品,每件商品都有它的价值和截止售卖日期(超过这个日期就不能再卖了).卖一件商品消耗一个单位时间,售卖顺序是可以 ...

  2. Codeforces 437D The Child and Zoo(贪心+并查集)

    题目链接:Codeforces 437D The Child and Zoo 题目大意:小孩子去參观动物园,动物园分非常多个区,每一个区有若干种动物,拥有的动物种数作为该区的权值.然后有m条路,每条路 ...

  3. 【BZOJ1854】游戏[SCOI2009](神奇贪心+并查集)

    这道题和今年GDKOI的Day2T2很像(然而gdkoi的题用网络流可以A,这道题只能拿30). 网址:http://www.lydsy.com/JudgeOnline/problem.php?id= ...

  4. 洛谷 P1525 关押罪犯 NOIp2010提高组 (贪心+并查集)

    题目链接:https://www.luogu.org/problemnew/show/P1525 题目分析 通过分析,我们可以知道,这道题的抽象意义就是把一个带边权的无向图,分成两个点集,使得两个集合 ...

  5. Supermarket(贪心/并查集)

    题目链接 原创的博客 题意: 超市里有N个商品. 第i个商品必须在保质期(第di天)之前卖掉, 若卖掉可让超市获得pi的利润. 每天只能卖一个商品. 现在你要让超市获得最大的利润. n , p[i], ...

  6. AcWing:145. 超市(贪心 + 小根堆 or 贪心 + 并查集)

    超市里有N件商品,每个商品都有利润pipi和过期时间didi,每天只能卖一件商品,过期商品(即当天di<=0di<=0)不能再卖. 求合理安排每天卖的商品的情况下,可以得到的最大收益是多少 ...

  7. poj1456(贪心+并查集)

    题目链接: http://poj.org/problem?id=1456 题意: 有n个商品, 已知每个商品的价格和销售截止日期, 每销售一件商品需要花费一天, 即一天只能销售一件商品, 问最多能买多 ...

  8. POJ 1456 Supermarket(贪心+并查集优化)

    一开始思路弄错了,刚开始想的时候误把所有截止时间为2的不一定一定要在2的时候买,而是可以在1的时候买. 举个例子: 50 2  10 1   20 2   10 1    50+20 50 2  40 ...

  9. Codeforces Round #346 (Div. 2) F. Polycarp and Hay 并查集

    题目链接: 题目 F. Polycarp and Hay time limit per test: 4 seconds memory limit per test: 512 megabytes inp ...

随机推荐

  1. DOM的基本操作

    什么是DOM 1:文档对象模型(DocumentObjectModel,DOM) 2:DOM定义了访问和操作HTML文档的标准方法. 3:DOM将HTML 文档表达为树结构. 其他查询元素的方法: d ...

  2. [转帖] select、poll、epoll之间的区别总结[整理] + 知乎大神解答 https://blog.csdn.net/qq546770908/article/details/53082870 不过图都裂了.

    select.poll.epoll之间的区别总结[整理] + 知乎大神解答 2016年11月08日 15:37:15 阅读数:2569 http://www.cnblogs.com/Anker/p/3 ...

  3. hive存储、数据模型、内部表

    创建内部表 加一列元素 删除表

  4. 关于python项目路径导入自己写的库出错的一点思考

    其实也是在写自己项目的时候遇到的,以前也遇到了但是一直采取的是回避的策略,这次总算弄清楚所以总结一下. 这个项目的顶级目录是medivac,他本身是一个python模块. 熟悉flask的人都知道,在 ...

  5. 关于python 自带csv库的使用心得 附带操作实例以及excel下乱码的解决

    因为上次帮我们产品处理过一个文件,他想生成能excel处理操作的.但是上次由于时间非常紧张,所以并没有处理好. 正好无聊就来好好研究一下 ,找算法要了几个 csv文件.来好好玩一玩. 全篇使用了pyt ...

  6. Python调用C++类

    http://blog.csdn.net/liyuan_669/article/details/25361655 C++导出类到Python http://blog.csdn.net/arnozhan ...

  7. codeforces431B

    Shower Line CodeForces - 431B Many students live in a dormitory. A dormitory is a whole new world of ...

  8. Maven概述(一)

    Maven是什么? Apache Maven is a software project management and comprehension tool. Based on the concept ...

  9. docker--compose--sonarqube

    Create this docker-compose.yml file: version: "2" services: sonarqube: image: sonarqube po ...

  10. day10 前向引用

    风湿理论,函数即变量.没定义没加载(开辟内存空间).都是没法用的 不定义调用必然出错 def foo(): print("from foo") bar () # 标红 foo() ...