首页 > 其他分享 >个人训练赛反思第一篇

个人训练赛反思第一篇

时间:2022-11-16 19:45:38浏览次数:35  
标签:lb STL 第一篇 st int vector pile 反思 训练赛

Atcoder 260_D 反思

先回顾一下怎么想的

其实一开始拿到这个题就去$ Onenote $画了个草图 因为直接照着英文题面思考的话会很困难……不过这也促成了很好的思考

但是这个事情没有做完啊……能写出这种数据结构:

using vec=list<int>;

struct pile{
    int topm,cnt;
    vec* ve;
    pile(int x,vec* p=0,int c=1): topm(x),ve(p),cnt(c) {
        if(p) p->push_back(x);
    }
    bool operator<(const pile& rhs)const{return topm<rhs.topm;}
};
set<pile> s;

更别提这个(类似成员函数的)函数:

    void add(const pile* _this,int x,int i,decltype(s.begin()) lb){
        if(_this->cnt==k-1){
            seq[x]=i;
            for(auto j: *(_this->ve) )seq[j]=i;
            delete _this->ve;
            s.erase(lb);
        }
        else{
            _this->ve ->push_back(x);
            s.erase(lb);
            s.insert(pile(x,_this->ve,_this->cnt+1));
        }
    }

呃呃直接堆叠STL(STL套STL)当然不好 于是STL套指向STL的指针?小天才

怎么做更好呢?

当然是手写STL啊…… 不开玩笑的。
不定长数组就学学Atcoder解答さん的vector构造函数(2个参数的重载版本),相当于赋好初值的一个不定长数组。
而且真的足够快……相信-O2的力量!

链表?不需要的。维护每个东西\(key\)的:
\(val\)数组、\(pre/nex\)数组
(\(val\)数组完全可以不止一个唷,本题就是牌面和自己是牌堆第几张牌)

这样的话就是利用了更基本的STL(vector当VLA用,实现所谓类型安全,且有很多方便的成员函数)来实现数据结构

这才对嘛……就好比set不当作自己是个红黑树,rank()和kth()都不提供,STL也不是“给你实现好了的数据结构”:它的内部组织形式对外不可见!你只能获得一些时空复杂度上的保证,并不知道也不需要知道其内部如何实现。

看看Atcoder解答さん怎么做的

需要声明的容器

  vector<int> under(n+5,-1);
  vector<int> pile(n+5,0);
  set<int> st;
  vector<int> res(n+5,-1);

这就足够实现单链表,不需要也不要用std::list<> 或者std::vector<> 当list用

新建牌堆

  for(int i=1;i<=n;i++){
    int p;
    cin >> p;
    auto it=st.upper_bound(p);
    if(it==st.end()){
      pile[p]=1;
      st.insert(p); // 敢直接用p而不用val数组是因为p是 1 ~ N 的,不然我想还是 val[cnt++]=read();
    }

以上部分基本一样捏,不同的是Atcoder解答さん使用的set的模板参数是int,这样既快(set应该内部会有复制吧……)又明了,不会出现->

// lb是set<pile>::forward_iterator,先 *运算得到pile对象,再 & 得到_this指针
// 于是这里的 &* 运算就不是白干的…… 而且要运算一小会
add(&(*lb),x,i,lb);

这种神奇语句。

插入已有牌堆

直接注释在里面好了

    else{
      under[p]=(*it);        // 这就是前驱数组
      pile[p]=pile[(*it)]+1; // 记录 p 是第几张牌
      st.erase(it);
      st.insert(p);          // 抹了旧的换上新的
    }
    
    if(pile[p]==k){
      st.erase(p);
      int x=p;               // 确实大佬们也不怎么压行的…… 感觉做题的时候心思有些过多用于优化代码…… 
                             // 不过已经形成习惯的话也好。譬如这里我会把 x 的初始化放在 for 第一句里。甚至更狠,见下
      for(int j=0;j<k;j++){  // 链表的遍历捏
        res[x]=i;
        x=under[x];
      }
      
      // 链表遍历的简介做法捏(under[]初值为 0 的话 就用按位取反判断.end():
      // for(int x=p; ~x; x=under[x]) res[x]=i;
    }
  }

最后输出res[]就好啦,C++11甚至14普及的当下直接用for(auto&& i:res)方便高效。

さいごのさいご

学习decltype auto 初值列等等语法
不是为了装逼、或者更快CE、或者更容易导致个别神奇的点不通过的。

所以现在要在上面的常用压行(一般也会减小常数)等等迫真好习惯基础上再加这么几条:

  • 尽量不要STL套STL,STL套“指向STL的指针”不行!
  • 需要多阅读Atcoder解答さん以及其他大佬的代码,学习他们的有创意且高效的做法
    譬如vector(_Num, __initializer)来构造不定长数组同时赋初值。

其实以上可以概括为先想好了再做题
但是这几个字太抽象,事实上着手这个题的时候我也稍稍想了想有没有更好的做法,but failed。
所以需要多多写博客。今天这是第一篇,就多唠唠嗑,后面直接高效率总结需要改进的点就好了。

标签:lb,STL,第一篇,st,int,vector,pile,反思,训练赛
From: https://www.cnblogs.com/quanqiutong-u1/p/16897275.html

相关文章

  • Clovershrub的第一篇博客
    纪念第一篇博客的诞生~~......
  • 我的第一篇blog
    一级标题二级标题三级标题今天我学了...会了c++里的函数#include<iostream>usingnamespacestd;intmain(){ intn; cin>>n; cout<<n; return0;}......
  • 多进程多线程记录第一篇
    多线程与多进程一,什么是进程,什么是线程?​ 进程:运行中的程序.每次我们执行一个程序,咱们的操作系统对自动的为这个程序准备一些必要的资源(例如,分配内存,创......
  • 一个超经典 WinForm 卡死问题的再反思
    一:背景1.讲故事这篇文章起源于昨天的一位朋友发给我的dump文件,说它的程序出现了卡死,看了下程序的主线程栈,居然又碰到了OnUserPreferenceChanged导致的挂死问题,真的是经......
  • 个人学习WCF笔记1——[转][老老实实学WCF] 第一篇 Hello WCF
    PS:1)了解WCF的一些相关概念2)简单地一个实例,把服务器端和客户端搭建起来并实现通讯=========================================================老老实实学WCF 第一篇......
  • 第一篇博客
    Markdown学习标题:二级标题三级标题四级标题 字体helloworld!helloworld!helloworld!helloworld!引用选择分割线图片 超链接点击跳转列表a......
  • Android Studio编程第一篇:反应时间测试(RTI)
    目标参与者必须选择并按住屏幕底部的一个按钮。上面有一个圆圈(一个用于简单模式,五个用于五种选择模式)。在每一种情况下,其中一个圆圈中都会出现一个黄色的圆点,参与者必须尽......
  • 读书之《程序员修炼之道:从小工到专家》十一月第一篇
    本博客为笔者阅读《程序员修炼之道:从小工到专家》的读书笔记十一月第一篇,也是整个过程的第五篇,值得一提的是,每月两篇正好八篇,而本书正好八章,因此每一篇博客都将是对于对应......
  • 我深刻反思了一下自己。
    上个周末幸得空闲时间和爱人去图书馆学习看书,整理了一下思绪,回忆了一下这两年自己的心态变化,成长经历,学习状态,时间管理等,于是乎我发现自己变懒了,趁着今天反思一下自己,也希......
  • CSP2022 反思
    首先挖一下坟最后还是错了脑瘫错误。。。。。。。。。。。。。。。。。。。。。。。。。。。。。T1大概是60(用spfa然后深搜),然而lyx大佬发现原来跑n遍迪杰斯特拉就满了(我......