题目中的要求如果x在y的左边,不需要移动,x在y的右边,2操作不需要移动。

有一个问题是,如果x与y相邻,这时的swap操作变成了三个而不是四个,这点尤其需要注意,不然就会死循环。注意x是和y相邻,这时应该考虑x在y的左边还是在y的右边,因为修改指针的操作是有方向性的。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int maxn=1e5+10;
  4. struct Node {
  5. int left,right,val;
  6. }node[maxn];
  7. void Link(int x,int y)
  8. {
  9. node[x].right=y;
  10. node[y].left=x;
  11. }
  12. int main()
  13. {
  14. int n,m,comm,x,y,rev_cnt;
  15. while (scanf("%d%d",&n,&m)!=EOF) {
  16. rev_cnt=0;
  17. for (int i=1;i<=n+1;i++) {
  18. node[i].val=i;
  19. node[i].left=i-1;
  20. node[i].right=i+1;
  21. }
  22. node[0].right=1;
  23. node[n+1].val=0;
  24. node[n+1].right=-1;
  25. while (m--) {
  26. scanf("%d",&comm);
  27. if (comm!=4) {
  28. scanf("%d%d",&x,&y);
  29. }
  30. if (rev_cnt%2==1) {
  31. if (comm==1) {
  32. comm=2;
  33. }
  34. else if (comm==2) {
  35. comm=1;
  36. }
  37. }
  38. if (comm==1) {
  39. if (node[x].right==y) {
  40. continue;
  41. }
  42. int lx=node[x].left,rx=node[x].right,ly=node[y].left,ry=node[y].right;
  43. Link(lx,rx);
  44. Link(ly,x);
  45. Link(x,y);
  46. }
  47. else if (comm==2) {
  48. if (node[y].right==x) {
  49. continue;
  50. }
  51. int lx=node[x].left,rx=node[x].right,ly=node[y].left,ry=node[y].right;
  52. Link(lx,rx);
  53. Link(y,x);
  54. Link(x,ry);
  55. }
  56. else if (comm==3) {
  57. if (node[x].right==y) {
  58. int lx=node[x].left,rx=node[x].right,ly=node[y].left,ry=node[y].right;
  59. Link(lx,y);
  60. Link(y,x);
  61. Link(x,ry);
  62. }
  63. else if (node[y].right==x) {
  64. int tmp=x;
  65. x=y;
  66. y=tmp;
  67. int lx=node[x].left,rx=node[x].right,ly=node[y].left,ry=node[y].right;
  68. Link(lx,y);
  69. Link(y,x);
  70. Link(x,ry);
  71. }
  72. else {
  73. int lx=node[x].left,rx=node[x].right,ly=node[y].left,ry=node[y].right;
  74. Link(lx,y);
  75. Link(y,rx);
  76. Link(ly,x);
  77. Link(x,ry);
  78. }
  79. }
  80. else {
  81. rev_cnt++;
  82. }
  83. // for (int i=node[0].right;i>0;i=node[i].right) {
  84. // printf("%d\n",node[i].val);
  85. // }
  86. }
  87. int k;
  88. if (rev_cnt%2==1&&n%2==0) {
  89. k=0;
  90. }
  91. else {
  92. k=1;
  93. }
  94. long long ans=0,cnt=1;
  95. for (int i=node[0].right;i>0;i=node[i].right) {
  96. if (cnt%2==k) {
  97. ans+=node[i].val;
  98. }
  99. //printf("%d\n",node[i].val);
  100. cnt++;
  101. }
  102. printf("%lld\n",ans);
  103. }
  104. }

National Contest for Private Universities (NCPU), 2019 C Boxes(双向链表)的更多相关文章

  1. The Preliminary Contest for ICPC Asia Shanghai 2019 C Triple(FFT+暴力)

    The Preliminary Contest for ICPC Asia Shanghai 2019 C Triple(FFT+暴力) 传送门:https://nanti.jisuanke.com/ ...

  2. 2015 Syrian Private Universities Collegiate Programming Contest 题解

    题目在这里>_< 发现这场比赛在网上没有完整的题解,甚至连题目代码都没人贴出来(大概是因为题目太水了吧...).所以宝宝就来写个题解,也就当作成长记录了233333 A. Window 题 ...

  3. 2015 Syrian Private Universities Collegiate Programming Contest

    A. Window B. Paper Game Des:给你一个矩形集合,一开始只有一个W*H的矩形.每次可以选一个矩形,切成两个并加入集合,长和宽必须是正整数.不能操作者输,求先手赢还是输.(1 ≤ ...

  4. The Preliminary Contest for ICPC Asia Nanjing 2019/2019南京网络赛——题解

    (施工中……已更新DF) 比赛传送门:https://www.jisuanke.com/contest/3004 D. Robots(期望dp) 题意 给一个DAG,保证入度为$0$的点只有$1$,出 ...

  5. 计蒜客 41391.query-二维偏序+树状数组(预处理出来满足情况的gcd) (The Preliminary Contest for ICPC Asia Xuzhou 2019 I.) 2019年徐州网络赛)

    query Given a permutation pp of length nn, you are asked to answer mm queries, each query can be rep ...

  6. The Preliminary Contest for ICPC Asia Xuzhou 2019 E XKC's basketball team [单调栈上二分]

    也许更好的阅读体验 \(\mathcal{Description}\) 给n个数,与一个数m,求\(a_i\)右边最后一个至少比\(a_i\)大\(m\)的数与这个数之间有多少个数 \(2\leq n ...

  7. [The Preliminary Contest for ICPC Asia Nanjing 2019] A-The beautiful values of the palace(二维偏序+思维)

    >传送门< 前言 这题比赛的时候觉得能做,硬是怼了一个半小时,最后还是放弃了.开始想到用二维前缀和,结果$n\leq 10^{6}$时间和空间上都爆了,没有办法.赛后看题解用树状数组,一看 ...

  8. 计蒜客 The Preliminary Contest for ICPC Asia Nanjing 2019

    F    Greedy Sequence You're given a permutation aa of length nn (1 \le n \le 10^51≤n≤105). For each  ...

  9. The Preliminary Contest for ICPC Asia Xuzhou 2019

    A:Who is better? 题目链接:https://nanti.jisuanke.com/t/41383 题意: 类似于有N个石子,先手第一次不能拿完,每次后手只能拿 1 到 前一次拿的数量* ...

随机推荐

  1. Android Studio3.0.0之前首次安装通用配置

    一.第一次安装: 温馨提示:在安装Android Studio之前,建议先提前准备好单独的Android SDK,这个可以在AndroidDevTools网站下载.以前用Eclipse做过Androi ...

  2. setUserData

    node.setUserData();//设置每个节点的datanode.getUserData();

  3. python:文件、目录遍历器

    #!/usr/bin/python# -*- coding:utf-8 -*- import osimport json file = open('a.txt','w')for root,dirs,f ...

  4. msfconsole启动失败并报错`not_after=': bignum too big to convert into `long'的解决方法

    1.启动msfconsole失败并报如下错误: /usr/share/metasploit-framework/lib/msf/core/payload/android.rb:86:in `not_a ...

  5. 在SQL2005中修改数据库名称

    SQL Server 2005中有个数据库HT_WisdomDataBaseCenter,现在要将其改名为HT_NBSBOneNetcs1步骤:(1) 分离数据库:打开management studi ...

  6. 洛谷P1147 连续自然数和

    https://www.luogu.org/problem/P1147 #include<bits/stdc++.h> using namespace std; int main(){ i ...

  7. (转)Boyer-Moore算法

    转自:Boyer-Moore算法 一.简述 在当前用于查找子字符串的算法中,BM(Boyer-Moore)算法是当前有效且应用比较广的一中算法,各种文本编辑器的“查找”功能(Ctrl+F),大多采用B ...

  8. 题解 P4289 【[HAOI2008]移动玩具】

    题目地址:https://www.luogu.com.cn/problem/P4289 题解原地址:https://createsj.blog.luogu.org/solution-p4289 让我们 ...

  9. 关于真机测试root权限问题

    普通用户好像也无伤大雅: 输入后看到这样的有个美元符号,说明你的虚拟机获取不了权限,有权限的应该是root和#都有,这个时候你输入su 如果还是没有变化,看看你的虚拟机是不是android7.0,An ...

  10. pybind11简介

    python调用C/C++有不少的方法,如boost.python, swig, ctypes, pybind11等,这些方法有繁有简,而pybind11的优点是对C++ 11支持很好,API比较简单 ...