IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 2021“MINIEYE杯”中国大学生算法设计超级联赛(9)07题 HDU 7072 Boring data structure problem 可查链表 -> 正文阅读

[数据结构与算法]2021“MINIEYE杯”中国大学生算法设计超级联赛(9)07题 HDU 7072 Boring data structure problem 可查链表

文章目录


这种签到题场上居然不过,果然是自己的链表水平太差.

题意

维护一个数据结构.要求能进行四种操作:

  • L L L 在左边插入一个数字
  • R R R 在右边插入一个数字
  • G G G 删除一个已经有的数
  • Q Q Q 询问在中间的数字,有偶数个的话回答偏右的那个.

保证每次插入的数字是 1 , 2 , 3... 1,2,3... 1,2,3...按顺序的自然数,不会重复.
操作的次数为 1 0 7 10^7 107,后面两个操作的次数不超过 1.5 × 1 0 6 1.5\times 10^6 1.5×106,只有一组数据.

题解

显然不能用带 l o g log log的数据结构维护.
考虑使用两个 d e q u e deque deque进行维护,保持右边的 s i z e size size和左边相等或者比左边多一个,则右边 d e q u e deque deque的最左边那个即为答案.
删除的时候就直接标记,只用两个数表示两边数字的个数可以忽略掉已经删除的数.
我没有用这种维护方法,而是使用了一种自创新数据结构:可查链表.
众所周知链表是可以 O ( 1 ) O(1) O(1)插入删除但是需要 O ( n ) O(n) O(n)进行查找的一种数据结构.
但是本题中,按顺序插入没有重复的特点保证了我们可以在插入的时候直接标记 x x x的位置 i d x id_x idx?,这样删除的时候直接删除 i d x id_x idx?,并且动态维护中间数 a n s ans ans,由于插入和删除操作每次只有一个数,因此中间数每次也最多移动一位,只要用一个 l e n len len标记当前数据结构中数字的个数即可对这个答案进行维护了,所有的操作复杂度均为 O ( 1 ) O(1) O(1).
不幸的是,由于我对链表不甚熟练,场上并没有调出来.(比赛结束后删掉四个字符就AC了,当场去世.)
昨天牛客的时候也是拖的假匈牙利板子,不知道自己上辈子造了什么孽.
贴一下自己的渣代码.由于开 2 × 1 0 7 2\times 10^7 2×107长度的数组会导致 M L E MLE MLE,只能开 1600 万 1600万 1600,不是非常严谨,但由于本题只有一组数据,可以通过.

const int yuzu=8e6;
typedef int fuko[yuzu<<1|13];
fuko net,pre,id,a;
int main() {
  int q,i,cntl=yuzu,len=0,cntr=yuzu+1,now=0,ans=-1;
  /*
  本题所使用的可查链表有左头和右头,分别向两边添加的时候只要普通的添加即可.
  初始位置在maxn>>1的位置.
  */
  for (scanf("%d",&q);q--;) {
    char op; int x;
    auto addl=[&](int x) {
      ++len,id[x]=cntl;
      net[cntl]=~a[cntl+1]?cntl+1:net[cntl];
      pre[cntl]=cntl-1;
      a[cntl]=x;
      if (!~ans) { // 考虑到加入的数有可能被全部删去,在没有数的时候就将ans置-1.
        ans=cntl--;
        return;
      } 
      --cntl;
      if (len&1) ans=pre[ans]; // 向左边添加数字到奇数个的时候ans要左移.
    };
    auto addr=[&](int x) {
      ++len,id[x]=cntr;
      net[cntr]=cntr+1;
      pre[cntr]=~a[cntr-1]?cntr-1:pre[cntr];
      a[cntr]=x;
      if (!~ans) {
        ans=cntr++;
        return;
      }
      ++cntr; 
      if (!(len&1)) ans=net[ans]; // 这边也是因此类推.
    };
    auto del=[&](int x) {
      pre[net[x]]=pre[x];
      net[pre[x]]=net[x];
      a[x]=-1; // 删掉的数标记为-1.
      --len;
      if (!len) { // 删光了所有数,ans要等于-1,随时待命,加入第一个数的时候就把ans放到这个数的位置.
        ans=-1;
        return;
      } 
      if (x==ans) {
        ans=len&1?pre[ans]:net[ans];
      } else if (x<ans) {
        !(len&1)?ans=net[ans]:0;
      } else {
        len&1?ans=pre[ans]:0;
      } // ans移动分为刚好删掉了中间数,删掉的数在左边或者右边来讨论.
    };
    scanf("\n%c",&op);
    if (op=='L') {
      addl(++now);
    } else if (op=='R') {
      addr(++now);
    } else if (op=='G') {
      scanf("%d",&x);
      del(id[x]);
    } else {
      printf("%d\n",a[ans]);
    }
  }
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-18 12:56:50  更:2021-08-18 12:58:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 20:29:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码