题意:1~n这n个数,给你一个初始的顺序,再告诉你那两个数的大小关系发生了变化,求变化后的 顺序,不存在则输出IMPOSSIBLE

思路:这题很遗憾没在比赛的时候过掉,结束后加了一行就AC了。题目真的不难,我就是根据原顺序和变化得到任意两个数之间的大小关系。然后枚举变化后的这些数对,用构造法构造一个合法的序列,最后再和原顺序进行不重复的合并。两个数组,两个指针,合并的时候未发生变化的当前数若大于变化的当前数,则输出原数,否则输出变化后的数,并将对应数组指针后移。再对得到的新顺序进行合法判断,若大小关系和要求的完全一致,则输出答案,否则无解。

这题还有更简单的拓扑排序做法,我正在研究,稍后更新。

  1. #pragma comment(linker, "/STACK:1000000000")
  2. #include <bits/stdc++.h>
  3. #define LL long long
  4. #define INF 0x3f3f3f3f
  5. #define IN freopen("E.in","r",stdin);
  6. #define OUT freopen("out.txt", "w", stdout);
  7. using namespace std;
  8. #define MAXN 505
  9. #define MAXM 25005
  10. int s[MAXM], t[MAXM];
  11. int a[MAXN], b[MAXN], pos[MAXN], c[MAXN];
  12. bool dayu[MAXN][MAXN], res[MAXN][MAXN], u[MAXN][MAXN];
  13. bool vis[MAXN];
  14. int main()
  15. {
  16. int T;
  17. scanf("%d", &T);
  18. int cas = ;
  19. while(T--){
  20. cas++;
  21. int n;
  22. scanf("%d", &n);
  23. for(int i = ; i <= n; i++){
  24. scanf("%d", &a[i]);
  25. }
  26. memset(dayu, , sizeof(dayu));
  27. memset(vis, , sizeof(vis));
  28. memset(b, , sizeof(b));
  29. for(int i = ; i <= n; i++){
  30. for(int j = i + ; j <= n; j++){
  31. dayu[a[i]][a[j]] = true;
  32. }
  33. }
  34. int m;
  35. scanf("%d", &m);
  36. memset(u, , sizeof(u));
  37. for(int i = ; i <= m; i++){
  38. scanf("%d%d", &s[i], &t[i]);
  39. if(u[s[i]][t[i]]) continue;
  40. u[s[i]][t[i]] = true;
  41. dayu[s[i]][t[i]] = !dayu[s[i]][t[i]];
  42. dayu[t[i]][s[i]] = !dayu[t[i]][s[i]];
  43. }
  44. int x, y;
  45. int p = ;
  46. bool noans = false;
  47. for(int i = ; i <= m; i++){
  48. if(dayu[s[i]][t[i]]){
  49. x = t[i];
  50. y = s[i];
  51. }else{
  52. x = s[i];
  53. y = t[i];
  54. }
  55. if(!vis[x]){
  56. vis[x] = true;
  57. int j = p;
  58. if(p == ){
  59. b[++p] = x;
  60. }
  61. else{
  62. while(j >= && dayu[x][b[j]]){
  63. j--;
  64. }
  65. for(int k = p; k > j; k--){
  66. pos[b[k]]++;
  67. b[k + ] = b[k];
  68. }
  69. b[j + ] = x;
  70. p++;
  71. }
  72. pos[x] = j + ;
  73. }
  74. if(!vis[y]){
  75. vis[y] = true;
  76. int j = pos[x] - ;
  77. while(j >= && dayu[y][b[j]]){
  78. j--;
  79. }
  80. for(int k = p; k > j; k--){
  81. pos[b[k]]++;
  82. b[k + ] = b[k];
  83. }
  84. p++;
  85. b[j + ] = y;
  86. pos[y] = j + ;
  87. }
  88. }
  89. int j = ;
  90. memset(pos, , sizeof(pos));
  91. for(int i = ; i <= n; i++){
  92. if(vis[a[i]]){
  93. c[i] = b[j++];
  94. }
  95. else{
  96. if(dayu[a[i]][b[j]] || j > p){
  97. c[i] = a[i];
  98. }
  99. else{
  100. c[i] = b[j++];
  101. }
  102. }
  103. pos[c[i]] = i;
  104. }
  105. memset(res, , sizeof(res));
  106. for(int i = ; i <= n; i++){
  107. for(int j = i + ; j <= n; j++){
  108. res[c[i]][c[j]] = true;
  109. }
  110. }
  111. for(int i = ; i <= n; i++){
  112. for(int j = ; j <= n; j++){
  113. if(res[i][j] != dayu[i][j]){
  114. noans = true;
  115. break;
  116. }
  117. }
  118. if(noans){
  119. break;
  120. }
  121. }
  122. if(noans){
  123. printf("IMPOSSIBLE\n");
  124. continue;
  125. }
  126. for(int i = ; i < n; i++){
  127. printf("%d ", c[i]);
  128. }
  129. printf("%d\n", c[n]);
  130. }
  131. return ;
  132. }

UVA - 12263 Rankings 模拟(拓扑排序)的更多相关文章

  1. UVA 12263 Rankings(拓扑排序)

    给出一个n个数的序列1,然后有m个改动(a, b),在序列2中a跟b在序列中的相对顺序改变.求符合题意的序列2. 题中说道如果一个数的位置不确定,则输出‘?' ,仔细想想,这种情况是不会存在的,因为在 ...

  2. UVA215-Spreadsheet Calculator(模拟+拓扑排序)

    Problem UVA215-Spreadsheet Calculator Accept:401  Submit:2013 Time Limit: 3000 mSec Problem Descript ...

  3. UVA.10305 Ordering Tasks (拓扑排序)

    UVA.10305 Ordering Tasks 题意分析 详解请移步 算法学习 拓扑排序(TopSort) 拓扑排序的裸题 基本方法是,indegree表示入度表,vector存后继节点.在tops ...

  4. UVA 1572 Self-Assembly(拓扑排序)

    1 // 把一个图的所有结点排序,使得每一条有向边(u,v)对应的u都排在v的前面. 2 // 在图论中,这个问题称为拓扑排序.(toposort) 3 // 不难发现:如果图中存在有向环,则不存在拓 ...

  5. Uva 10305 - Ordering Tasks 拓扑排序基础水题 队列和dfs实现

    今天刚学的拓扑排序,大概搞懂后发现这题是赤裸裸的水题. 于是按自己想法敲了一遍,用queue做的,也就是Kahn算法,复杂度o(V+E),调完交上去,WA了... 于是检查了一遍又交了一发,还是WA. ...

  6. UVa 1572 Self-Assembly (拓扑排序)

    题目链接: https://cn.vjudge.net/problem/UVA-1572 Automatic Chemical Manufacturing is experimenting with ...

  7. UVa 10305 - Ordering Tasks (拓扑排序裸题)

    John has n tasks to do. Unfortunately, the tasks are not independent and the execution of one task i ...

  8. POJ——1308Is It A Tree?(模拟拓扑排序判断有向图是否为树)

    Is It A Tree? Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 28399   Accepted: 9684 De ...

  9. UVA 10305 Ordering Tasks(拓扑排序的队列解法)

    题目链接: https://vjudge.net/problem/UVA-10305#author=goodlife2017 题目描述 John有n个任务,但是有些任务需要在做完另外一些任务后才能做. ...

随机推荐

  1. Linux 操作基础(一) -- Shell 命令格式和元字符

    1 命令格式 cmd [-选项] [参数] 说明: • 最简单的Shell命令只有命令名,复杂的Shell命令可以有多个选项和参数 • 参数是文件也可以是目录,有些命令必须使用多个操作对象 • 并非所 ...

  2. 如何绑定host

    绑定host一般分为windows和linux下两种情况. windows下,首先打开host文件,其操作步骤 ,打开 C:\Windows\System32\Drivers\etc\hosts的文件 ...

  3. axios简单封装

    写在最前面 新手前端刚刚接触vue,感觉真的好用.项目中需要使用axios,然后学习了一下.借鉴网上一些大佬的经验,现在分享一下axios的简单封装,如果有什么错误的地方,请大家指出. axios安装 ...

  4. 高并发web系统设计

    转载自:http://blog.csdn.net/qq_26562641/article/details/53170913 一.一般高并发web系统这里的一般指的是秒杀之类的电子商务系统,比如说小米抢 ...

  5. orale 中创建定时任务

    --添加变量 variable job1 number; --创建JOB begin   dbms_job.submit(:job1,'testjob;',sysdate, 'TRUNC(sysdat ...

  6. 建筑建模学习笔记2——3DMax房屋框架建模

    以下这幅图是用3DMax做出的大体的框架 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I ...

  7. RISC-V首度被我国列入扶持对象,上海已成RISC-V重要“据点”

    时间:2018年7月24日 16:33 摘要:近期,上海市经济信息委发布了<上海市经济信息化委关于开展2018年度第二批上海市软件和集成电路产业发展专项资金(集成电路和电子信息制造领域)项目申报 ...

  8. matplotlib 可视化 —— 定制画布风格 Customizing plots with style sheets(plt.style)

    Customizing plots with style sheets - Matplotlib 1.5.1 documentation 1. 使用和显示其他画布风格 >> import ...

  9. 使用 Spring HATEOAS 开发 REST 服务--转

    原文地址:https://www.ibm.com/developerworks/cn/java/j-lo-SpringHATEOAS/index.html?ca=drs-&utm_source ...

  10. Swift学习笔记(1):基础部分

    目录: 分号 常量和变量 数据类型 数值型类型转换 类型别名 元组 可选类型 API版本检查 分号 Swift并不强制要求你在每条语句的结尾处使用分号( ; ),你也可以按照自己的习惯添加分号.如果在 ...