【封装工程】OI/ACM常用封装
前言
笔者有的时候无聊,就将一些奇怪的东西封装起来。
范围主要是在\(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常用封装的更多相关文章
- React Native之TextInput的介绍与使用(富文本封装与使用实例,常用输入框封装与使用实例)
React Native之TextInput的介绍与使用(富文本封装与使用实例,常用输入框封装与使用实例) TextInput组件介绍 TextInput是一个允许用户在应用中通过键盘输入文本的基本组 ...
- Lua常用封装方法
Lua 获取随机值 --获取随机值,指定上限和下限 function getRandom(min,max) -- 接收一个整数n作为随即序列的种子 math.randomseed(os.time()) ...
- Java 字节的常用封装
一. Java 的字节 byte (字节) 是 Java 中的基本数据类型,一个 byte 包含8个 bit(位),byte 的取值范围是-128到+127. byte 跟 Java 其他基本类型的关 ...
- 多态、Object类和 JDK常用封装类型
多态 定义:某一类事物的多种存在形态. 多态的体现:父类的引用指向了自己的子类对象.父类的引用也可以接收自己的子类对象. 多态的前提:必须是类与类之间有关系,要么继承,要么实现.通常还有一个前提,存在 ...
- 第一百六十一节,封装库--JavaScript,完整封装库文件
封装库--JavaScript,完整封装库文件 /** *feng_zhuang_ku_1.0版本,js封装库,2016/12/29日:林贵秀 **/ /** 前台调用 * 每次调用$()创建库对象, ...
- ACM常用算法及练习(2)
ACM常用算法及练习 知识类型 重要度 容易度 应掌握度 典型题 其他 数据结构(5) 链表 ★★☆ ★★★ ★★☆ 栈 stack ★★★ ★★★ ★★★ HLoj120 ...
- ACM常用算法及练习(1)
ACM常用算法及练习 第一阶段:练经典常用算法,下面的每个算法给我打上十到二十遍,同时自己精简代码,因为太常用,所以要练到写时不用想,10-15分钟内打完,甚至关掉显示器都可以把程序打出来. 1.最短 ...
- Redis操作Hash工具类封装,Redis工具类封装
Redis操作Hash工具类封装,Redis工具类封装 >>>>>>>>>>>>>>>>>> ...
- Redis操作字符串工具类封装,Redis工具类封装
Redis操作字符串工具类封装,Redis工具类封装 >>>>>>>>>>>>>>>>>>& ...
随机推荐
- 浅谈Linux du命令
**du(disk usage),顾名思义,查看目录/文件占用空间大小** 1.查看当前目录下的所有目录以及子目录的大小 du -h du -ah #-h:用K.M.G的人性化形式显示#-a:显示目 ...
- 小菜鸟之java异常
一.异常简介 什么是异常? 异常就是有异于常态,和正常情况不一样,有错误出错.在java中,阻止当前方法或作用域的情况,称之为异常. java中异常的体系是怎么样的呢? 1.Java中的所有不正常类都 ...
- n=C(2,n)+k(构造)( Print a 1337-string)Educational Codeforces Round 70 (Rated for Div. 2)
题目链接:https://codeforc.es/contest/1202/problem/D 题意: 给你一个数 n ( <=1e9 ),让你构造137713713.....(只含有1,3,7 ...
- MySQL 如何更改某一用户及伞下成员的path
MySQL 如何更改某一用户及伞下成员的path 在有的系统中,推荐关系的维护不只是pid那么简单,为了某些业务,可能还会需要维护path字段,path字段的存在,优点在于查询方便,最起码不用递归了 ...
- python_操作MySQL 初解 之__<类方法调用并 增-删-改-查>
文件一: 调用(sqls文件) # 导入模块 import pymysql from sqls import * # 创建类 class KaoShi(object): # 初始化 def __ini ...
- ATM机小程序
用规范化项目录的格式模拟一个ATM系统. 项目功能: 登录(可支持多个账户(非同时)登录) 注册 查看余额 存钱 转账(给其他用户转钱) 查看账户流水 退出 提供的思路:ATM直译就是取款机,但是咱们 ...
- Ruby学习中(首探数组, 注释, 运算符, 三元表达式, 字符串)
一. 数组 1.定义一个数组 games = ["英雄联盟", "绝地求生", "钢铁雄心"] puts games 2.数组的循环 gam ...
- PB中的DataStore的应用示例
编程过程中想在窗口中加一个下拉列表(DDLB),原来听同学说过可以动态改变下拉列表的值,数据库中的表改变,前台客户端的下拉列表就会变,记得当时同学说的是用一个叫下拉数据窗口(DDDW)的东西做的,一直 ...
- Codeforces 1221F. Choose a Square
传送门 对于某个点 $(x,y)$ ,不妨设 $x<y$ 因为如果 $x>y$ 直接按 $y=x$ 对称一下即可 当且仅当正方形左下角 $(a,a)$ 满足 $a<=x$,右上角 $ ...
- SpringBoot上传文件,经过spingCloud-Zuul,中文文件名乱码解决办法
最近用springCloud整合springboot做分布式服务发现经过zuul之后上传的中文文件名乱码全都变成?????,从而引发异常,单独用springboot却是好的,在网上找到相关资料总结如下 ...