任意门:http://www.lydsy.com/JudgeOnline/problem.php?id=1562

题目:

对于0,1,…,N-1的N个整数,给定一个距离序列D0,D1,…,DN-1,定义一个变换序列T0,T1,…,TN-1使得每个i,Ti的环上距离等于Di。一个合法的变换序列应是0,1,…,N-1的一个排列,任务是要求出字典序最小的那个变换序列。

题解:

二分建图是显而易见的,可是怎么处理字典序最小?

大神博客:https://www.byvoid.com/blog/noi-2009-transform/

实际倒着做一遍就可以了,正确性显然(只不过我不是这样写的);

先做最大匹配,然后看所匹配的是否为最小标号,不是则强行改值,然后再做最大匹配看是否有完备匹配,无则将值改回。

代码:

  1. #include<iostream>
  2. #include<cstring>
  3. #include<cstdio>
  4. using namespace std;
  5. bool vis[];
  6. int f[],pre[],v[],now[];
  7. int a[],b[];
  8. int n,ans,tot,cc;
  9. void insert(int a, int b)
  10. {
  11. tot++; pre[tot]=now[a]; now[a]=tot; v[tot]=b;
  12. }
  13. bool dfs(int x)
  14. {
  15. if (x<cc) return false;
  16. for (int i=now[x]; i; i=pre[i])
  17. {
  18. if (!vis[v[i]])
  19. {
  20. vis[v[i]]=true;
  21. if (f[v[i]]==- || dfs(f[v[i]]))
  22. {
  23. f[v[i]]=x;
  24. f[x]=v[i];
  25. return true;
  26. }
  27. }
  28. }
  29. return false;
  30. }
  31. int main()
  32. {
  33. int d;
  34. scanf("%d",&n);
  35. tot=;
  36. for (int i=; i<=n; i++)
  37. {
  38. scanf("%d",&d);
  39. a[i]=(i+d) % n;
  40. if (a[i]==) a[i]=n;
  41. b[i]=(i-d);
  42. if (b[i]<)
  43. b[i]+=n;
  44. if (a[i]>b[i])
  45. {
  46. int c;
  47. c=a[i]; a[i]=b[i]; b[i]=c;
  48. }
  49. a[i]+=n; b[i]+=n;
  50. insert(i,a[i]);
  51. insert(i,b[i]);
  52. }
  53. memset(f,-,sizeof(f));
  54. ans=;
  55. for (int i=; i<=n; i++)
  56. {
  57. memset(vis,false,sizeof(vis));
  58. if (dfs(i)) ans++;
  59. }
  60. if (ans<n) { printf("No Answer\n"); return ;}
  61. for (int i=; i<=n; i++)
  62. {
  63. if (f[i]!=a[i])
  64. {
  65. cc=i;
  66. memset(vis,false,sizeof(vis));
  67. int t=f[a[i]];
  68. f[a[i]]=i;
  69. f[b[i]]=-;
  70. vis[a[i]]=true;
  71. if (dfs(t))
  72. {
  73. f[i]=a[i];
  74. }
  75. else
  76. {
  77. f[b[i]]=i;
  78. f[a[i]]=t;
  79.  
  80. }
  81. }
  82. }
  83. for (int i=; i<n; i++)
  84. {
  85. printf("%d ",f[i]-n-);
  86. }
  87. printf("%d\n",f[n]-n-);
  88. return ;
  89. }

bzoj1562[NOI2009]变换序列——2016——3——12的更多相关文章

  1. BZOJ1562: [NOI2009]变换序列(二分图 匈牙利)

    Description Input Output Sample Input 5 1 1 2 2 1 Sample Output 1 2 4 0 3 HINT 30%的数据中N≤50:60%的数据中N≤ ...

  2. [BZOJ1562][NOI2009] 变换序列

    Description Input Output Sample Input 5 1 1 2 2 1 Sample Output 1 2 4 0 3 HINT 30%的数据中N≤50:60%的数据中N≤ ...

  3. BZOJ1562——[NOI2009]变换序列

    1.题意:题意有些难理解 2.分析:我们发现如果要求判断是否合法的话就so easy了,二分图匹配即可,但是我们发现要求输出字典序最小的,那么我们在匈牙利的时候就倒着枚举,另外邻接表中的边一定要排好序 ...

  4. BZOJ1562 [NOI2009]变换序列 【KM算法】

    题目 输入格式 输出格式 输入样例 5 1 1 2 2 1 输出样例 1 2 4 0 3 提示 30%的数据中N≤50: 60%的数据中N≤500: 100%的数据中N≤10000. 题解 每个位置可 ...

  5. Bzoj 1562: [NOI2009]变换序列 匈牙利算法,二分图匹配

    题目: http://cojs.tk/cogs/problem/problem.php?pid=409 409. [NOI2009]变换序列 ★★☆   输入文件:transform.in   输出文 ...

  6. BZOJ 1562 [NOI2009] 变换序列

    [NOI2009] 变换序列 [题解] 就是有一个序列,每个位置可以填两个数,不可重复,问最小字典序. 显然,可以建一个二分图,判合法就是找完美匹配. 那怎么弄最小字典序呢?有好多种解法,我这里给出了 ...

  7. [Luogu 1963] NOI2009 变换序列

    [Luogu 1963] NOI2009 变换序列 先%Dalao's Blog 什么?二分图匹配?这个确定可以建图? 「没有建不成图的图论题,只有你想不出的建模方法.」 建图相当玄学,不过理解大约也 ...

  8. noi2009变换序列

    noi2009变换序列 一.题目 1843 变换序列 2009年NOI全国竞赛  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master 题解       题目描述  ...

  9. Luogu P1963 [NOI2009]变换序列(二分图匹配)

    P1963 [NOI2009]变换序列 题意 题目描述 对于\(N\)个整数\(0,1, \cdots ,N-1\),一个变换序列\(T\)可以将\(i\)变成\(T_i\),其中\(T_i \in ...

随机推荐

  1. Android Studio ADB响应失败解决方法(2CTo.com)

    当启动Android Studio时,如果弹出 adb not responding. you can wait more,or kill "adb.exe" process ma ...

  2. opentsdb

    http://blog.javachen.com/2014/01/22/all-things-opentsdb.html http://blog.csdn.net/bingjie1217/articl ...

  3. STM8|STM32 看门狗使用

    源:STM8|STM32 看门狗使用 STM8和STM32都配备了独立看门狗,其作用之大不言而喻.以下为STM8及STM32的独立看门狗使用例: 对于STM32单片机: #define SYS_IWD ...

  4. Java-老夫对泛型的理解。。

    什么是泛型,在我看来 泛型就是能够限制类,方法,数组-变量的类型 比如说  List<String,int> list = new List<String,int> 就是有尖括 ...

  5. ARM汇编指令集

    一.跳转指令.跳转指令用于实现程序流程的跳转,在ARM程序中有以下两种方法可以实现程序流程的跳转. Ⅰ.使用专门的跳转指令.Ⅱ.直接向程序计数器PC写入跳转地址值. 通过向程序计数器PC写入跳转地址值 ...

  6. git log 查看 当前分支的 提交历史

    git log  查看 当前分支的 提交历史 在提交了若干更新之后,想回顾下提交历史,可以使用 git log 命令查看 默认不用任何参数的话,git log 会按提交时间列出所有的更新,最近的更新排 ...

  7. SQL复习六(视图)

    视图是关系数据库系统提供给用户以多角度观察数据库中数据的一种重要方法.视图是从一个或者几个表中导出的虚拟表.视图一经定义就可以被查询和删除.也可以在视图上定义视图.用视图完成数据的更新(增,删,改)操 ...

  8. Spring ---annotation (重点)--Resource, Component 重要!!!

    beans.xml: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="ht ...

  9. Camera服务之--架构浅析

    Camera服务之--架构浅析 分类: Camera 分析2011-12-22 11:17 7685人阅读 评论(3) 收藏 举报 android硬件驱动框架jnilinux内核平台 一.应用层 Ca ...

  10. javascript 函数的基础知识

    1. Why JavaScript functions always return a value? I'm taking a course in JavaScript programming, an ...