ACM常用模板

前言

注意事项:

1、当需要读取大量的数据,推荐使用scanf printf

2、字符串最好使用char []来存储,不要用string,否则可能会占用大量内存及减低速度

常用头文件

#define _CRT_SBCURE_NO_DEPRECATE
#include <bits/stdc++.h>
#include <iostream>
#include <algorithm>
#include <functional>
#include <set>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <string>

 
typedef long long ll;
const int INF = 0x3f3f3f3f;
std::ios::sync_with_stdio(false);

STL常用方法

void iterator () {    // 获取迭代器
    容器::iterator it;
    it = 容器.begin();
    it = 容器.end();
    容器::reverse_iterator it;
    it = 容器.rbegin();
    it = 容器.rend();
}
void funtion() {
    
    transform(begin, end, begin, ::toupper); // 转换大写
    transform(begin, end, begin, ::tolower); // 转换小写

    lower_bound(begin, end, num);    // 返回第一个符合条件的地址
    upper_bound(begin, end, num);    // 返回最后符合条件的地址
    upper_bound(begin, end, num, greater<int>());// 从大到小排序后

    assign(begin, end);        // 赋值给调用者
    copy(begin, end, begin);   // 拷贝
    fill(begin, end, num);     // 用num填充数组
    
    count(bengin, end, num);        // 返回指定元素出现的次数
    count_if(begin, end, func);     // 返回指定条件元素出现的次数
    equal(begin, end, begin, func); // 判断指定条件下是否相等
    find(begin, end, num);          // 查找一个元素
    search(begin, end, begin, end); // 在第一个序列中查找第二个序列
    search_n(begin, end, n, num);   // 查找n个连续的num
      
    
    remove(begin, end, num); // 删除所有值为num的元素 
    erase(begin, end);       // 删除区间元素   
    sort(begin, end);        // 排序
    swap(num, num);          // 交换
    reverse(begin, end);     // 反转
    next_permutation(begin, end); // 下一排列
}


bitset<n> a(10);           // 将10进制转化为n位二进制数
itoa(int n,char* s,int r)  // 将10进制n转换为r进制并赋给s


STL序列容器

// vector是顺序容器,支持随机访问
void vector() {
    vector<int> v;
    v.push_back(); // 尾部插入
    v.pop_back();  // 弹出最后一个元素
    v.at();        // 返回编号位数据
    v.insert();    // 指定位置插入
    v.front();     // 返回第一个元素
    v.back();      // 返回最后一个元素
    v.resize();    // 重置大小
    v.clear();     // 清空容器
    v.empty();     // 判断是否为空
    v.size();      // 返回容器大小
    v.swap();      // 与另一个vector交换数据
}

// list中的数据元素是通过链表指针串连成逻辑意义上的线性表
void list() {
    list<int> l;
    l.push_front();
    l.push_back(); 
    l.front();
    l.back();
    l.pop_front();
    l.pop_back();
    l.remove();   // 删除指定数值
    l.merge();    // 合并两个list
}

// deque双端队列
void deque() {
    deque<int> d;
    d.push_front();
    d.push_back();
    d.insert();
    d.at();
    d.front();
    d.back();
    d.pop_front();
    d.pop_back();
}

STL容器适配器

// queue队列
void queue() {
    queue<int> q;
    q.push();
    q.pop();
    q.front();
    q.back();
    q.empty();
    q.size();

}

// priority_queue 优先队列
void priority_queue() {
    // 与队列一样,特性是队列中最大(小)的元素总是位于队首
    // greater从小到大 less从大到小
    priority_queue<int,vector<int>,greater<int>> q;
    q.top();    // 相当于队列的front()
}

// stack栈
void stack() {
    stack<int> s;
    s.push();
    s.top();
    s.pop();
    s.empty();
    s.size();
}

STL关联式容器

typedef pair<int,int> P;

// set / multiset: multiset中值可以重复出现
void set() {
    set<int> s;
    s.insert();
    s.count();
    s.find();
}

// map / multimap: multimap允许重复元素
void map() {
    map<int,int> m;
    m[1] = 1;
    m.insert(P(1,1));
    m.insert(map<int,int>::value_type(1,1));
    m.keySet();
    map.get(key);
}

尺取法

int chiqu() {
    int l = 0,r = 0;
    int ans = 0,len = MAXN;
    while(true)
    {
        while(r <= n && ans < S)
            r ++,ans += num[r];
        if(ans < S)  break;
        len = min(len,r - l + 1);
        ans -= num[l ++];
    }
    return len < n ? len : 0;
}

模拟退火算法

/*==================================================*\ 
 | J(y):在状态y时的评价函数值
 | Y(i):表示当前状态, Y(i+1):表示新的状态
 | r: 用于控制降温的快慢
 | T: 系统的温度,系统初始应该要处于一个高温的状态
 | T_min :温度的下限,若温度T达到T_min,则停止搜索
\*==================================================*/

while( T > T_min ) {
  dE = J( Y(i+1) ) - J( Y(i) ) ; 

  if ( dE >=0 ) //表达移动后得到更优解,则总是接受移动
       Y(i+1) = Y(i) ; //接受从Y(i)到Y(i+1)的移动
  else {
      // 函数exp( dE/T )的取值范围是(0,1) ,dE/T越大,则exp( dE/T )也
      if ( exp( -dE/T ) > random( 0 , 1 ) )
      Y(i+1) = Y(i) ; //接受从Y(i)到Y(i+1)的移动
  }
  T = r * T ; //降温退火 ,0<r<1 。r越大,降温越慢;r越小,降温越快
  // 若r过大,则搜索到全局最优解的可能会较高,但搜索的过程也就较长。
    //若r过小,则搜索的过程会很快,但最终可能会达到一个局部最优值
  i ++ ;
}

 

代码多源于网络,更多模板

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1 图论 3 1.1 术语 3 1.2 独立集、覆盖集、支配集之间关系 3 1.3 DFS 4 1.3.1 割顶 6 1.3.2 桥 7 1.3.3 强连通分量 7 1.4 最小点基 7 1.5 拓扑排序 7 1.6 欧拉路 8 1.7 哈密顿路(正确?) 9 1.8 Bellman-ford 9 1.9 差分约束系统(用bellman-ford解) 10 1.10 dag最短路径 10 1.11 二分图匹配 11 1.11.1 匈牙利算法 11 1.11.2 KM算法 12 1.12 网络流 15 1.12.1 最大流 15 1.12.2 上下界的网络的最大流 17 1.12.3 上下界的网络的最小流 17 1.12.4 最小费用最大流 18 1.12.5 上下界的网络的最小费用最小流 21 2 数论 21 2.1 最大公约数gcd 21 2.2 最小公倍数lcm 22 2.3 快速幂取模B^LmodP(O(logb)) 22 2.4 Fermat小定理 22 2.5 Rabin-Miller伪素数测试 22 2.6 Pollard-rho 22 2.7 扩展欧几里德算法extended-gcd 24 2.8 欧拉定理 24 2.9 线性同余方程ax≡b(mod n) 24 2.10 中国剩余定理 25 2.11 Discrete Logging(BL == N (mod P)) 26 2.12 N!最后一个不为0的数字 27 2.13 2^14以内的素数 27 3 数据结构 31 3.1 堆(最小堆) 31 3.1.1 删除最小值元素: 31 3.1.2 插入元素和向上调整: 32 3.1.3 堆的建立 32 3.2 并查集 32 3.3 树状数组 33 3.3.1 LOWBIT 33 3.3.2 修改a[p] 33 3.3.3 前缀和A[1]+…+A[p] 34 3.3.4 一个二维树状数组的程序 34 3.4 线段树 35 3.5 字符串 38 3.5.1 字符串哈希 38 3.5.2 KMP算法 40 4 计算几何 41 4.1 直线交点 41 4.2 判断线段相交 41 4.3 三点外接圆圆心 42 4.4 判断点在多边形内 43 4.5 两圆交面积 43 4.6 最小包围圆 44 4.7 经纬度坐标 46 4.8 凸包 46 5 Problem 48 5.1 RMQ-LCA 48 5.1.1 Range Minimum Query(RMQ) 49 5.1.2 Lowest Common Ancestor (LCA) 53 5.1.3 Reduction from LCA to RMQ 56 5.1.4 From RMQ to LCA 57 5.1.5 An algorithm for the restricted RMQ 60 5.1.6 An AC programme 61 5.2 最长公共子序列LCS 64 5.3 最长上升子序列/最长不下降子序列(LIS) 65 5.3.1 O(n^2) 65 5.3.2 O(nlogn) 66 5.4 Joseph问题 67 5.5 0/1背包问题 68 6 组合数学相关 69 6.1 The Number of the Same BST 69 6.2 排列生成 71 6.3 逆序 72 6.3.1 归并排序求逆序 72 7 数值分析 72 7.1 二分法 72 7.2 迭代法(x=f(x)) 73 7.3 牛顿迭代 74 7.4 数值积分 74 7.5 高斯消元 75 8 其它 77

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值