前言

笔者有的时候无聊,就将一些奇怪的东西封装起来。

范围主要是在\(OI\)或者\(ACM\)中的常见数据结构等。

随着笔者的能力的提升,可能会对原来的封装程序进行修改,并且保留原来的版本。

【ST表(静态RMQ)】

// program at 2019-11-12
template <class T, int N, int M>
struct ST {
  T f[N + 5][M + 1];
  int log2[N];
  T compare(T x, T y) { // can change, depend on the priority of problem
    return x < y ? x : y;
  }
  void init(int* a) {
    log2[0] = -1;
    for (int i = 1; i <= N; i++)
      f[i][0] = a[i], log2[i] = log2[i >> 1] + 1;
    for (int j = 1; j <= M; j++)
      for (int i = 1; i + (1 << j) - 1 <= N; i++)
        f[i][j] = compare(f[i][j - 1], f[i + (1 << (j - 1))][j - 1]);
  }
  T query(int l, int r) {
    int k = log2[r - l + 1];
    return compare(f[l][k], f[r - (1 << k) + 1][k]);
  }
};

高精度

四位压位高精,支持高精加高精、高精减高精(\(a>b\))、高精乘高精、高精乘低精。

// program at 2019-11-14
struct bigint {
  static const int BASE = 10000;
  static const int SIZE = 105
  int len, a[SIZE];
  bigint() {
    memset(a, 0, sizeof a);
    len = 1;
  }
  bigint(long long x) { *this = x; }
  void operator=(int x) {
    len = 0;
    while (x) {
      a[++len] = x % BASE;
      x /= BASE;
    }
  }

  friend bigint operator+(bigint a, bigint b) {
    bigint c;
    c.len = max(a.len, b.len) + 1;
    for (int i = 1, x = 0; i <= c.len; i++)
      c.a[i] = a.a[i] + b.a[i] + x, x = c.a[i] / BASE, c.a[i] %= BASE;
    while (!c.a[c.len]) c.len--;
    return c;
  }

  friend bigint operator-(bigint a, bigint b) {
    a.len = max(a.len, b.len);
    for (int i = 1; i <= a.len; i++) {
      if (a.a[i] < b.a[i])
        a.a[i] += BASE, a.a[i + 1]--;
      a.a[i] -= b.a[i];
    }
    while (!a.a[a.len]) a.len--;
    return a;
  }

  friend bigint operator*(bigint a, bigint b) {
    bigint c;
    c.len = a.len + b.len;
    for (int i = 1; i <= a.len; i++) {
      int x = 0;
      for (int j = 1; j <= b.len; j++)
        c.a[i + j - 1] += a.a[i] * b.a[j] + x, x = c.a[i + j - 1] / BASE, c.a[i + j - 1] %= BASE;
      c.a[b.len + i] = x;
    }
    while (!c.a[c.len]) c.len--;
    return c;
  }

  friend bigint operator*(bigint a, int b) {
    a.len += 3;
    for (int i = 1; i <= a.len; i++) a.a[i] *= b;
    for (int i = 1; i <= a.len; i++) a.a[i + 1] += a.a[i] / BASE, a.a[i] %= BASE;
    while (!a.a[a.len]) a.len--;
    return a;
  }

  void print() {
    printf("%d", a[len]);
    for (int i = len - 1; i >= 1; i--) printf("%04d", a[i]);
    puts("");
  }

  bigint& operator+=(bigint b) {
    *this = *this + b;
    return *this;
  }

  bigint& operator-=(bigint b) {
    *this = *this - b;
    return *this;
  }

  bigint& operator*=(bigint b) {
    *this = *this * b;
    return *this;
  }
};

【封装工程】OI/ACM常用封装的更多相关文章

  1. React Native之TextInput的介绍与使用(富文本封装与使用实例,常用输入框封装与使用实例)

    React Native之TextInput的介绍与使用(富文本封装与使用实例,常用输入框封装与使用实例) TextInput组件介绍 TextInput是一个允许用户在应用中通过键盘输入文本的基本组 ...

  2. Lua常用封装方法

    Lua 获取随机值 --获取随机值,指定上限和下限 function getRandom(min,max) -- 接收一个整数n作为随即序列的种子 math.randomseed(os.time()) ...

  3. Java 字节的常用封装

    一. Java 的字节 byte (字节) 是 Java 中的基本数据类型,一个 byte 包含8个 bit(位),byte 的取值范围是-128到+127. byte 跟 Java 其他基本类型的关 ...

  4. 多态、Object类和 JDK常用封装类型

    多态 定义:某一类事物的多种存在形态. 多态的体现:父类的引用指向了自己的子类对象.父类的引用也可以接收自己的子类对象. 多态的前提:必须是类与类之间有关系,要么继承,要么实现.通常还有一个前提,存在 ...

  5. 第一百六十一节,封装库--JavaScript,完整封装库文件

    封装库--JavaScript,完整封装库文件 /** *feng_zhuang_ku_1.0版本,js封装库,2016/12/29日:林贵秀 **/ /** 前台调用 * 每次调用$()创建库对象, ...

  6. ACM常用算法及练习(2)

    ACM常用算法及练习 知识类型 重要度 容易度 应掌握度 典型题 其他           数据结构(5) 链表 ★★☆ ★★★ ★★☆     栈 stack ★★★ ★★★ ★★★ HLoj120 ...

  7. ACM常用算法及练习(1)

    ACM常用算法及练习 第一阶段:练经典常用算法,下面的每个算法给我打上十到二十遍,同时自己精简代码,因为太常用,所以要练到写时不用想,10-15分钟内打完,甚至关掉显示器都可以把程序打出来. 1.最短 ...

  8. Redis操作Hash工具类封装,Redis工具类封装

    Redis操作Hash工具类封装,Redis工具类封装 >>>>>>>>>>>>>>>>>> ...

  9. Redis操作字符串工具类封装,Redis工具类封装

    Redis操作字符串工具类封装,Redis工具类封装 >>>>>>>>>>>>>>>>>>& ...

随机推荐

  1. job创建之后,不运行

    创建job的时候要commit,然后还要看job是否分派进程 加上之后还是没有执行,后来发现 show parameter job_queue_process; 的结果为0,没有为job分配进程,所以 ...

  2. 打印指针要用%p而不要用%x

    注意: 打印指针要用%p而不要用%x 原因: https://boredzo.org/blog/archives/2007-01-23/please-do-not-use-percent-x-for- ...

  3. mysql事务、redo日志、undo日志、checkpoint详解

    转载: https://zhuanlan.zhihu.com/p/34650908 事务: 说起mysql innodb存储引擎的事务,首先想到就是ACID(不知道的请google),数据库是如何做到 ...

  4. java中this总结(转载请注明出处)

    1:this在构造方法中:this可以进行构造方法中的相互调用,this(参数): 2:this调用方法中,代表调用该方法的对象的地址,例如下面的代码比较 package thisTest; publ ...

  5. MySQL性能优化(四):SQL优化

    原文:MySQL性能优化(四):SQL优化 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/ ...

  6. Charles学习(三)之使用Map local代理本地静态资源以及配置网页代理在Mac模拟器调试iOS客户端

    前言 问题一:我们在App内嵌H5开发的过程中,肯定会遇到一个问题就是我不想在chrome的控制台中调试,我想要在手机上调试,那么如何解决这个问题呢? 问题二:我们期待调试时达到的效果就是和Charl ...

  7. Delphi SpeedButton组件

  8. 17、Nginx HTTPS 实践

    1.HTTPS安全证书基本概述 为什么需要使用HTTPS, 因为HTTP不安全.当我们使用http网站时,会遭到劫持和篡改,如果采用https协议,那么数据在传输过程中是加密的,所以黑客无法窃取或者篡 ...

  9. nginx_rtmp

    rtmp { server { listen ; chunk_size ; max_connections ; #音视频流上传和播放地址都是 rtmp://你的IP/live/streamName # ...

  10. 对于国嵌上学期《一跃进入C大门》Mini2440的代码修正

    摸索了几天,加了无数的群,病急乱投医式地问了好多个人,终于改对了代码. 下面先贴出给的范例代码 这是C语言代码,是没有错的. 那么出错的地方就在start.S部分 很明显,MPLLCON地址错误,正确 ...