基础算法

二分

bool check(int x) {/* ... */} // 检查x是否满足某种性质// 区间[l, r]被划分成[l, mid]和[mid + 1, r]时使用:
int bsearch_1(int l, int r) {while (l < r) {int mid = l + r >> 1;if (check(mid)) r = mid;   //写r=mid,不需要+1// check()判断mid是否满足性质else l = mid + 1;}return l;
}// 区间[l, r]被划分成[l, mid - 1]和[mid, r]时使用:
int bsearch_2(int l, int r) {while (l < r) {int mid = l + r + 1 >> 1;if (check(mid)) l = mid;//如果写l=mid,需要+1else r = mid - 1;}return l;
}

数据结构

邻接表

int h[N],e[N],ne[N],idx = 0; void add(int a, int b) {e[idx] = b,ne[idx] = h[a],h[a] = idx++;
}memset(h,-1,sizeof(h));
  • 二维—邻接表
int h[N];//存所有的链表头
int e[N];//存所有的边->每个节点值
int ne[N];//存所有的节点的next是多少,节点i的下一个节点在哪里
int idx = 0; //存储当前用到了哪个点void add_to_head(int a, int b) { //在a所对应的单链表中插入节点b  e.g.(2,3)在2所对应的邻接表中插入节点3 对应图中2->3有一条有向边e[idx] = b; // 给节点三赋值ne[idx] = h[a];h[a] = idx++;//这样存,e[idx]的实际邻接表是乱序的,需要h[a],ne[],e[]的帮助输出有序序列
}

链表

int head = -1;
int e_one_dimension[N];
int ne_one_dimension[N];
int idx_one_dimension = 0;void add_to_head_one_dimension(int x) {e_one_dimension[idx_one_dimension] = x;ne[idx_one_dimension] = head; //head初值为-1head = idx_one_dimension++;
}

STL

vector, 变长数组,倍增的思想size()  返回元素个数empty()  返回是否为空clear()  清空front()/back()push_back()/pop_back()begin()/end()[]支持比较运算,按字典序pair<int, int>first, 第一个元素second, 第二个元素支持比较运算,以first为第一关键字,以second为第二关键字(字典序)string,字符串size()/length()  返回字符串长度empty()clear()substr(起始下标,(子串长度))  返回子串c_str()  返回字符串所在字符数组的起始地址queue, 队列size()empty()push()  向队尾插入一个元素front()  返回队头元素back()  返回队尾元素pop()  弹出队头元素priority_queue, 优先队列,默认是大根堆size()empty()push()  插入一个元素top()  返回堆顶元素pop()  弹出堆顶元素定义成小根堆的方式:priority_queue<int, vector<int>, greater<int>> q;stack, 栈size()empty()push()  向栈顶插入一个元素top()  返回栈顶元素pop()  弹出栈顶元素deque, 双端队列size()empty()clear()front()/back()push_back()/pop_back()push_front()/pop_front()begin()/end()[]set, map, multiset, multimap, 基于平衡二叉树(红黑树),动态维护有序序列size()empty()clear()begin()/end()++, -- 返回前驱和后继,时间复杂度 O(logn)set/multisetinsert()  插入一个数find()  查找一个数count()  返回某一个数的个数erase()(1) 输入是一个数x,删除所有x   O(k + logn)(2) 输入一个迭代器,删除这个迭代器lower_bound()/upper_bound()lower_bound(x)  返回大于等于x的最小的数的迭代器upper_bound(x)  返回大于x的最小的数的迭代器map/multimapinsert()  插入的数是一个pairerase()  输入的参数是pair或者迭代器find()[]  注意multimap不支持此操作。 时间复杂度是 O(logn)lower_bound()/upper_bound()unordered_set, unordered_map, unordered_multiset, unordered_multimap, 哈希表和上面类似,增删改查的时间复杂度是 O(1)不支持 lower_bound()/upper_bound(), 迭代器的++,--bitset, 圧位bitset<10000> s;~, &, |, ^>>, <<==, !=[]count()  返回有多少个1any()  判断是否至少有一个1none()  判断是否全为0set()  把所有位置成1set(k, v)  将第k位变成vreset()  把所有位变成0flip()  等价于~flip(k) 把第k位取反

输入输出优化

参考代码

namespace IO {const int MAXSIZE = 1 << 20;
char buf[MAXSIZE], *p1, *p2;
#define gc()                                                               \(p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, MAXSIZE, stdin), p1 == p2) \? EOF                                                               \: *p1++)
inline int rd() {int x = 0, f = 1;char c = gc();while (!isdigit(c)) {if (c == '-') f = -1;c = gc();}while (isdigit(c)) x = x * 10 + (c ^ 48), c = gc();return x * f;
}
char pbuf[1 << 20], *pp = pbuf;
inline void push(const char &c) {if (pp - pbuf == 1 << 20) fwrite(pbuf, 1, 1 << 20, stdout), pp = pbuf;*pp++ = c;
}
inline void write(int x) {static int sta[35];int top = 0;do {sta[top++] = x % 10, x /= 10;} while (x);while (top) push(sta[--top] + '0');
}
}  // namespace IO

食用说明

  1. 使用namespace中的函数,加上using namespace IO,如果只想单独调用一个函数,使用using IO::rd类似的rd处填你想要的函数
  2. 读入时使用n = rd()并且在输入结束后加上EOF代表文件输入结束。
    注意:在dev C++中,回车后在单行输入Ctrl Z
template <typename T>
inline void read(T &x) {x = 0;LL f = 1;char c = getchar();for (; !isdigit(c); c = getchar())if (c == '-')f = -1;for (; isdigit(c); c = getchar()) x = x * 10 + c - 48;x *= f;
}
template <typename T>
inline void write(T x) {if(x < 0) {putchar('-'); x = -x;}if(x > 9) write(x / 10);putchar(x % 10 + '0');
}
template <typename T>
inline void writesp(T x, char sp = '\n') {write(x); putchar(sp);
}

调试

debug(a)

#define debug(a) cout << #a << " " << a << endl

高精度

高精度PI

const double PI=acos(-1.0);

最大最小值

template<class T>
inline void ckmin(T &a, T b) { if (b < a) a = b; }template<class T>
inline void ckmax(T &a, T b) { if (b > a) a = b; }

大数模板

已重载的运算符

运算符类型 运算符
双目运算符 +(加), -(减), *(乘), /(整除), %(取模)
关系运算符 ==(等于), !=(不等于), <(小于), >(大于), <=(小于等于), >=(大于等于)
逻辑运算符 ||(逻辑或), &&(逻辑与), !(逻辑非)
单目运算符 +(正), -(负)
自增自减运算符 ++(自增), –(自减)
赋值运算符 =, +=, -=, *=, /=, %=
位运算符 >>(右移运算符,与输入流关联), <<(左移运算符,与输出流关联)

支持的其他函数

函数声明 函数功能
size_t size() const 返回 BigInteger 对象的位数
BigInteger e(size_t n) const 返回 BigInteger 对象 × $10^n $后的值
BigInteger abs() const 返回 BigInteger 对象的绝对值
#include <bits/stdc++.h>using namespace std;
#define ll long long
#define mod 1000000007
const ll maxn = 2e6 + 7;//大整数
struct BigInteger {static const int BASE = 100000000;//和WIDTH保持一致static const int WIDTH = 8;//八位一存储,如修改记得修改输出中的%08dbool sign;//符号, 0表示负数size_t length;vector<int> num;//反序存
//构造函数BigInteger(long long x = 0) { *this = x; }BigInteger(const string &x) { *this = x; }BigInteger(const BigInteger &x) { *this = x; }//剪掉前导0void cutLeadingZero() {while (num.back() == 0 && num.size() != 1) { num.pop_back(); }}//设置数的长度void setLength() {cutLeadingZero();int tmp = num.back();if (tmp == 0) { length = 1; }else {length = (num.size() - 1) * WIDTH;while (tmp > 0) {++length;tmp /= 10;}}}//赋值运算符BigInteger &operator=(long long x) {num.clear();if (x >= 0) sign = true;else {sign = false;x = -x;}do {num.push_back(x % BASE);x /= BASE;} while (x > 0);setLength();return *this;}//赋值运算符BigInteger &operator=(const string &str) {num.clear();sign = (str[0] != '-');//设置符号int x, len = (str.size() - 1 - (!sign)) / WIDTH + 1;for (int i = 0; i < len; i++) {int End = str.length() - i * WIDTH;int start = max((int) (!sign), End - WIDTH);//防止越界sscanf(str.substr(start, End - start).c_str(), "%d", &x);num.push_back(x);}setLength();return *this;}//赋值运算符BigInteger &operator=(const BigInteger &tmp) {num = tmp.num;sign = tmp.sign;length = tmp.length;return *this;}//将该大数变为一个字符串 string tostring() {string ans = "";for (int i = 0; i < num.size(); i++)ans.insert(0, to_string(num[i]));if (!sign) ans.insert(0, "-");//负数 return ans;}//数的位数size_t size() const { return length; }//*10^n 除法中用到BigInteger e(size_t n) const {int tmp = n % WIDTH;BigInteger ans;ans.length = n + 1;n /= WIDTH;while (ans.num.size() <= n) ans.num.push_back(0);ans.num[n] = 1;while (tmp--) ans.num[n] *= 10;return ans * (*this);}//绝对值BigInteger abs() const {BigInteger ans(*this);ans.sign = true;return ans;}//正号const BigInteger &operator+() const { return *this; }// + 运算符BigInteger operator+(const BigInteger &b) const {if (!b.sign) { return *this - (-b); }if (!sign) { return b - (-*this); }BigInteger ans;ans.num.clear();for (int i = 0, g = 0;; i++) {if (g == 0 && i >= num.size() && i >= b.num.size()) break;int x = g;if (i < num.size()) x += num[i];if (i < b.num.size()) x += b.num[i];ans.num.push_back(x % BASE);g = x / BASE;}ans.setLength();return ans;}//负号BigInteger operator-() const {BigInteger ans(*this);if (ans != 0) ans.sign = !ans.sign;return ans;}// - 运算符BigInteger operator-(const BigInteger &b) const {if (!b.sign) { return *this + (-b); }if (!sign) { return -((-*this) + b); }if (*this < b) { return -(b - *this); }BigInteger ans;ans.num.clear();for (int i = 0, g = 0;; i++) {if (g == 0 && i >= num.size() && i >= b.num.size()) break;int x = g;g = 0;if (i < num.size()) x += num[i];if (i < b.num.size()) x -= b.num[i];if (x < 0) {x += BASE;g = -1;}ans.num.push_back(x);}ans.setLength();return ans;}// * 运算符BigInteger operator*(const BigInteger &b) const {int lena = num.size(), lenb = b.num.size();vector<long long> ansLL;for (int i = 0; i < lena + lenb; i++) ansLL.push_back(0);for (int i = 0; i < lena; i++) {for (int j = 0; j < lenb; j++) {ansLL[i + j] += (long long) num[i] * (long long) b.num[j];}}while (ansLL.back() == 0 && ansLL.size() != 1) ansLL.pop_back();int len = ansLL.size();long long g = 0, tmp;BigInteger ans;ans.sign = (ansLL.size() == 1 && ansLL[0] == 0) || (sign == b.sign);ans.num.clear();for (int i = 0; i < len; i++) {tmp = ansLL[i];ans.num.push_back((tmp + g) % BASE);g = (tmp + g) / BASE;}if (g > 0) ans.num.push_back(g);ans.setLength();return ans;}// / 运算符 (大数除小数)BigInteger operator/(const long long &b) const {BigInteger c;c.num.clear();for (int i = 0; i < num.size(); i++) {c.num.push_back(0);}long long g = 0;for (int i = num.size() - 1; i >= 0; i--) {c.num[i] = (num[i] + g * BASE) / b;g = num[i] + g * BASE - c.num[i] * b;}for (int i = num.size() - 1; c.num[i] == 0; i--) {c.num.pop_back();}return c;}// /运算符 (大数除大数)BigInteger operator/(const BigInteger &b) const {BigInteger aa((*this).abs());BigInteger bb(b.abs());if (aa < bb) return 0;char *str = new char[aa.size() + 1];memset(str, 0, sizeof(char) * (aa.size() + 1));BigInteger tmp;int lena = aa.length, lenb = bb.length;for (int i = 0; i <= lena - lenb; i++) {tmp = bb.e(lena - lenb - i);while (aa >= tmp) {++str[i];aa = aa - tmp;}str[i] += '0';}BigInteger ans(str);delete[]str;ans.sign = (ans == 0 || sign == b.sign);return ans;}// % 运算符 (大数取模小数)BigInteger operator%(const long long &b) const {long long ans = 0, lena = num.size();for (int i = lena - 1; i >= 0; i--) {ans = (ans * BASE + num[i]) % b;}return ans;}// %运算符 (大数取模大数)BigInteger operator%(const BigInteger &b) const {return *this - *this / b * b;}BigInteger &operator++() {*this = *this + 1;return *this;} // ++ 运算符BigInteger &operator--() {*this = *this - 1;return *this;} // -- 运算符BigInteger &operator+=(const BigInteger &b) {*this = *this + b;return *this;} // += 运算符BigInteger &operator-=(const BigInteger &b) {*this = *this - b;return *this;} // -= 运算符BigInteger &operator*=(const BigInteger &b) {*this = *this * b;return *this;} // *=运算符BigInteger &operator/=(const long long &b) {*this = *this / b;return *this;} // /=运算符BigInteger &operator/=(const BigInteger &b) {*this = *this / b;return *this;} // /= 运算符BigInteger &operator%=(const long long &b) {*this = *this % b;return *this;} // %=运算符BigInteger &operator%=(const BigInteger &b) {*this = *this % b;return *this;} // %=运算符
// < 运算符bool operator<(const BigInteger &b) const {if (sign && !b.sign) { return false; }//正负else if (!sign && b.sign) { return true; }//负正else if (!sign && !b.sign) { return -b < -*this; }//负负//正正if (num.size() != b.num.size()) return num.size() < b.num.size();for (int i = num.size() - 1; i >= 0; i--)if (num[i] != b.num[i]) return num[i] < b.num[i];return false;}bool operator>(const BigInteger &b) const { return b < *this; }              // >  运算符bool operator<=(const BigInteger &b) const { return !(b < *this); }           // <= 运算符bool operator>=(const BigInteger &b) const { return !(*this < b); }           // >= 运算符bool operator!=(const BigInteger &b) const { return b < *this || *this < b; }     // != 运算符bool operator==(const BigInteger &b) const { return !(b < *this) && !(*this < b); }//==运算符bool operator||(const BigInteger &b) const { return *this != 0 || b != 0; } // || 运算符bool operator&&(const BigInteger &b) const { return *this != 0 && b != 0; } // && 运算符bool operator!() { return (bool) (*this == 0); }                            // ! 运算符//重载<<使得可以直接输出大数friend ostream &operator<<(ostream &out, const BigInteger &x) {if (!x.sign) out << '-';out << x.num.back();for (int i = x.num.size() - 2; i >= 0; i--) {char buf[10];//如WIDTH和BASR有变化,此处要修改为%0(WIDTH)dsprintf(buf, "%08d", x.num[i]);for (int j = 0; j < strlen(buf); j++) out << buf[j];}return out;}//重载>>使得可以直接输入大数friend istream &operator>>(istream &in, BigInteger &x) {string str;in >> str;size_t len = str.size();int i, start = 0;if (str[0] == '-') start = 1;if (str[start] == '\0') return in;for (int i = start; i < len; i++) {if (str[i] < '0' || str[i] > '9') return in;}x.sign = !start;x = str.c_str();return in;}
};int main() {return 0;
}

数学

求C(n,m)

long long C(int n, int m){if (m < n - m) m = n - m;long long ans = 1;for (int i = m + 1; i <= n; i++) ans *= i;for (int i = 1; i <= n - m; i++) ans /= i;return ans;
}

快速幂

ll qpow(ll a, ll b) {ll ans = 1;a %= mod;assert(b >= 0);for(; b; b >>= 1) {if(b & 1)ans = ans * a % mod;a = a * a % mod;}return ans;
}

Gcd

ll gcd(ll a, ll b) {return b > 0 ? gcd(b, a % b) : a;
}

Exgcd

int exgcd(int a, int b, long long &d, long long &x, long long &y) {if(!b)d = a, x = 1, y = 0;elseexgcd(b, a % b, d, y, x), y -= (a / b) * x;
}

质数

bool isPrime(int a) {if (a < 2) return 0;for (int i = 2; i * i <= a; ++i)if (a % i) return 0;return 1;
}

常用模板 UPD12/4相关推荐

  1. html5常用模板下载网站

    html5常用模板下载网站 开创者素材.站长素材.模板之家 推荐葡萄家园素材网,他们网页模板栏目有个HTML模板,很多静态源码.应该是你所需要的. html静态页面模板 还是服饰素材啊 朋友 设计云 ...

  2. 雅思作文模板.html,雅思小作文常用模板万能句大全

    雅思小作文模板--柱状图 柱状图和线型图写法一致,并且结合饼状图来写! 表格题 1. 找出值,最小值,以及一般值 2. 进行分析比较,找出近似值和相差很大的数值 常用句式 1.a is nearly ...

  3. ros开发增加clion常用模板及初始化配置(六)

    ros开发增加clion常用模板及初始化配置(六) c++模板 cpp_regex正则匹配 #include <regex>Qstring checkcode="12312313 ...

  4. ros开发增加clion常用模板及初始化配置(五)

    ros开发增加clion常用模板及初始化配置(五) python模板 py_opencv_resize图片缩放_水平方向拉伸与左右截取 # 640 x 480 -> 1280 x 480(129 ...

  5. ros开发增加clion常用模板及初始化配置(四)

    ros开发增加clion常用模板及初始化配置(四) python模板 py_np_dot向量点乘 import numpy as np from math import sqrt# a与b点g乘得到一 ...

  6. ros开发增加clion常用模板及初始化配置(三)

    ros开发增加clion常用模板及初始化配置(三) python模板 py_math弧度转角度 import math DE2R = math.pi/180 #弧度=角度*DE2R py_unpack ...

  7. 软件测试实用技术与常用模板:内容提要

    内容提要 本书从软件测试实用理论和测试实训技术的角度出发, 以通俗易懂的语言讲述软件测试所需要的知识.并且以"手机信息管理系统模型"为测试软件平台,系统全面地对测试实用理论和实训技 ...

  8. 【VUE】vue3.0后台常用模板

    vue3.0后台常用模板: 1.vue-admin-perfect 在线预览 gitee国内访问地址:https://yuanzbz.gitee.io/vue-admin-perfect/#/home ...

  9. ros开发增加clion常用模板及初始化配置(二)

    ros开发增加clion常用模板及初始化配置(二) 在需要共享的文件夹内用控制台运行这个命令开启服务器,共享自己的文件,局域网电脑游览器登入这台电脑的ip加8000端口号即可访问 python -m ...

  10. ACM常用模板-数据结构

    数据结构方面常用模板总结,大多数代码摘自网络,个人整理总结 string: 任意进制转换:itoa(int n,char* s,int r) //将10进制n转换为r进制并赋给s流:#include& ...

最新文章

  1. 搭建Mantis 缺陷管理系统(转)
  2. 更新版-梳理前端开发使用eslint和prettier来检查和格式化代码问题
  3. 以游戏演绎1200多年前的古诗——《画境长恨歌》叙事设计思路分享
  4. 西南交大计算机组成原理考试大纲,西南交大计算机组成原理实验二七段LED数码管显示译码器的设计.docx...
  5. webServlet(/) 和 webServlet(/*) 的区别
  6. SharePoint 2013 基于表单 Membership 的身份验证
  7. P3372 【模板】线段树 1
  8. 设计模式(三)单实例模式
  9. 故宫网站遭“围攻”!
  10. [转]安装完成后机器重新启动运行 JBuilder 时却每次只是看到 L
  11. 错误一例:expected expression before } token
  12. 计算机445端口怎么打开,445端口,详细教您445端口怎么关闭
  13. 手机计算机怎么玩24点游戏,计算器上的24点游戏怎么操作
  14. ABP官方文档翻译 8.1 通知系统
  15. 免费视频存储平台(微云、百度网盘、谷歌硬盘、酷播云)的截图对比
  16. 如何在PS中将一张图片一次性裁剪保存成多张图片
  17. 羽毛球击球点与自身位置[羽球技术入门必读]
  18. Retrying connect to server: xxx.xxx.xxx.xxx:8032. Already tried 0 time(s)
  19. Switch游戏机Type-C底座方案
  20. Ubuntu 复制文件到远端时错误,Permission denied 失败原因深度探索

热门文章

  1. 由于系统限制了文件目录的读/写权限,程序将会退出,你可以重新安装百度网盘到有权限的目录或以管理员身份运行百度网盘。
  2. html打开txt文件怎么打开是乱码了,使用记事本打开TXT文件变乱码的解决办法
  3. visio怎么画球_cad怎么画装配图
  4. 股市预测python代码<循环神经网络>
  5. Word 关闭拼写检查 (去掉Word中拼写检查的所有红色和绿色的浪线)
  6. 如何应对项目需求变更?
  7. 范围变更管控案例_项目变更管理案例.doc
  8. 《微信公众号-腾讯问卷》02-如何在公众号中添加链接
  9. 酷家乐的 Istio 与 Knative 实践
  10. 2.7 汽车之家口碑爬虫