常用模板(持续更新)

总结一下常用的模板,方便自己使用。

1.最大公约数(欧几里得)和最小公倍数

1 typedef long long LL;
2
3 LL gcd(LL a,LL b){
4     return (b==0) ? a : gcd(b,a%b);
5 }
6
7 LL lcm(LL a,LL b){
8     return a/gcd(a,b)*b;
9 }

2.扩展欧几里得

 1 typedef long long LL;
 2
 3 LL e_gcd(LL a,LL b,LL &x,LL &y){
 4     LL d=a;
 5     if(b!=0){
 6         d=e_gcd(b,a%b,y,x);
 7         y-=(a/b)*x;
 8     }
 9     else{x=1;y=0;}
10     return d;
11 }//a*x+b*y=d;得到x,y,gcd(a,b); 

3.并查集

1 //递归版路径压缩
2 int find(int x){return x==Father[x]?x:Father[x]=find(Father[x]);}
3
4 void Union(int x,int y){
5     int fx=find(x),fy=find(y);
6     if(fx!=fy) Father[fx]=fy;
7 }//合并

4.快速幂

 1 //普通快速幂
 2 typedef long long LL;
 3 LL fast_mod(LL x,LL n,LL mod){
 4     LL ans=1;
 5     while(n>0){
 6         if(n&1) ans=(ans*x)%mod;
 7         x=(x*x)%mod;
 8         n>>=1;
 9     }
10     return ans;
11 }

5.素数筛

 1 //埃氏筛法
 2 int prime[N];
 3 bool is_prime[N+1];
 4
 5 //返回n以内素数的个数
 6 int sieve(int n){
 7     int p=0;
 8     for(int i=0;i<=n;i++) is_prime[i]=1;
 9     is_prime[0]=is_prime[1]=0;
10     for(int i=2;i<=n;i++){
11         if(is_prime[i]){
12             prime[p++]=i;
13             for(int j=2*i;j<=n;j+=i) is_prime[j]=0;
14         }
15     }
16     return p;
17 } 

6.三大基础背包

 1 void ZeroOnePack(int cost,int value){//01
 2     for(int j=v;j>=cost;j--){
 3         dp[j]=max(dp[j],dp[j-cost]+value);
 4     }
 5 }
 6
 7 void CompletePack(int cost,int value){//完全
 8     for(int j=cost;j<=v;j++){
 9         dp[j]=max(dp[j],dp[j-cost]+value);
10     }
11 }
12
13 void MultiplePack(int cost,int value,int cnt){//多重
14     if(v<=cnt*cost){//如果总容量比这个物品的容量要小,那么这个物品可以直到取完,相当于完全背包.
15         CompletePack(cost,value);
16         return ;
17     }
18     else{//否则就将多重背包转化为01背包
19         int k=1;
20         while(k<=cnt){
21             ZeroOnePack(k*cost,k*value);
22             cnt=cnt-k;
23             k=2*k;
24         }
25         ZeroOnePack(cnt*cost,cnt*value);
26     }
27 }

7.欧拉函数

1 void Euler(){
2     phi[1]=1;
3     for(int i=2;i<N;i++) phi[i]=i;
4     for(int i=2;i<N;i++){
5         if(phi[i]==i){
6             for(int j=i;j<N;j+=i) phi[j]=phi[j]/i*(i-1);
7         }
8     }
9 }

8.最短路

 1 //Floyd:(任意两点间的最短路问题)
 2 for(int k=0;k<n;k++)
 3 for(int i=0;i<n;i++)
 4 for(int j=0;j<n;j++)
 5 dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]);
 6
 7 //Dijkstra(无负边时的最短路问题)
 8 const int INF=0x3f3f3f3f;
 9 const int N=111111;
10
11 vector < pair<int,int> > E[N];
12 int n,m;
13 int d[N];
14
15 void init(){
16     for(int i=0;i<N;i++) d[i]=INF;
17     for(int i=0;i<N;i++) E[i].clear();
18 }
19
20 void dijkstra(int s,int d[]){
21     priority_queue <pair<int,int> > Q;
22     d[s]=0;
23     Q.push(make_pair(-d[s],s));
24
25     while(!Q.empty()){
26         int now=Q.top().second;
27         Q.pop();
28         for(int i=0;i<E[now].size();i++){
29             int v=E[now][i].first;
30             int D=d[now]+E[now][i].second;
31             if(d[v]>D){
32                 d[v]=D;
33                 Q.push(make_pair(-d[v],v));
34             }
35         }
36     }
37 } 

9.线段树

 1 typedef long long LL;
 2 LL ans;
 3 struct Tree
 4 {
 5     LL l,r;
 6     LL sum,add;
 7 };
 8 Tree tree[MAX*4];
 9
10 void pushup(LL x)
11 {
12     LL tmp=2*x;
13     tree[x].sum=tree[tmp].sum+tree[tmp+1].sum;
14 }
15
16
17 void pushdown(LL x)
18 {
19     LL tmp=2*x;
20     tree[tmp].add+=tree[x].add;
21     tree[tmp+1].add+=tree[x].add;
22     tree[tmp].sum+=tree[x].add*(tree[tmp].r-tree[tmp].l+1);
23     tree[tmp+1].sum+=tree[x].add*(tree[tmp+1].r-tree[tmp+1].l+1);
24     tree[x].add=0;
25 }
26
27 void build(int l,int r,int x)
28 {
29     tree[x].l=l;
30     tree[x].r=r;
31     tree[x].add=0;
32     if(l==r)
33     {
34         scanf("%lld",&tree[x].sum);
35         return ;
36     }
37     int tmp=x<<1;
38     int mid=(l+r)>>1;
39     build(l,mid,tmp);
40     build(mid+1,r,tmp+1);
41     pushup(x);
42 }
43
44
45 void update(LL l,LL r,LL c,LL x)
46 {
47     if(r<tree[x].l||l>tree[x].r) return ;
48     if(l<=tree[x].l&&r>=tree[x].r)
49     {
50         tree[x].add+=c;
51         tree[x].sum+=c*(tree[x].r-tree[x].l+1);
52         return ;
53     }
54     if(tree[x].add) pushdown(x);
55     LL tmp=x<<1;
56     update(l,r,c,tmp);
57     update(l,r,c,tmp+1);
58     pushup(x);
59 }
60
61
62 void query(LL l,LL r,LL x)
63 {
64     if(r<tree[x].l||l>tree[x].r) return ;
65     if(l<=tree[x].l&&r>=tree[x].r)
66     {
67         ans+=tree[x].sum;
68         return ;
69     }
70     if(tree[x].add) pushdown(x);
71     LL tmp=x<<1;
72     LL mid=(tree[x].l+tree[x].r)>>1;
73     if(r<=mid) query(l,r,tmp);
74     else if(l>mid) query(l,r,tmp+1);
75     else
76     {
77         query(l,mid,tmp);
78         query(mid+1,r,tmp+1);
79     }
80 }

10.枚举全排列

1 //这个东西有可能扫描不到全部的,可以在前面sort一下再扫.
2 do{
3
4 }while(next_permutation(num+1,num+1+n));//枚举全排列,输入从1开始,n个 
时间: 2024-11-05 16:04:31

常用模板(持续更新)的相关文章

git常用命令--持续更新中

开始使用git,还有一些命令没有用到,比如创建分支,创建tags等 持续学习,持续更新 1. git init --bare  //创建git工程 2. git clone [email protected]:/home/prj_git/xxx //导出一个git工程 3. git add xxx  //添加文件或目录 4. git commit -m "xxx" //添加更改信息 5. git push //提交工程 6. git pull //更新到最新 7. git log  /

东拼西凑的模板&#183;持续更新中

一.常用算法(应该不需要用到模板的那种常用) 1.1 快速幂 1 //https://blog.csdn.net/java_c_android/article/details/55802041 2 long long quickmod(long long a,long long b,long long m) 3 { 4 long long ans = 1; 5 while(b)//用一个循环从右到左便利b的所有二进制位 6 { 7 if(b&1)//判断此时b[i]的二进制位是否为1 8 { 9

Tomcat常用设置 &lt;持续更新&gt;

本篇主要用于修改一些常用配置时的参考.遇新常记,以备时需. =========================> Windows版 基本安装 在安装之前,JDK应该是已经安装妥当,并设置了%JAVA_HOME%与%JRE_HOME%: %JAVA_HOME% E:\Program Files\Java\jdk1.7.0_80 %JRE_HOME% E:\Program Files\Java\jdk1.7.0_80\jre 妥当后,在dos环境下用java -version 以及javac命令 检

[模板][持续更新]欧拉回路与欧拉路径浅析

Luogu P2731 骑马修栅栏 Riding the Fences 题目背景 Farmer John每年有很多栅栏要修理.他总是骑着马穿过每一个栅栏并修复它破损的地方. 题目描述 John是一个与其他农民一样懒的人.他讨厌骑马,因此从来不两次经过一个栅栏.你必须编一个程序,读入栅栏网络的描述,并计算出一条修栅栏的路径,使每个栅栏都恰好被经过一次.John能从任何一个顶点(即两个栅栏的交点)开始骑马,在任意一个顶点结束. 每一个栅栏连接两个顶点,顶点用1到500标号(虽然有的农场并没有500个

比赛模板(持续更新中)

1.数据结构 (1)线段树单点更新 #include <cstdio> #include <cstdlib> #include <algorithm> #include <cstring> #include <cmath> #define MAXN (1<<19) using namespace std; int segTree[MAXN]; void update(int i, int lft, int rht, int index

windows 批处理常用指令 -- 持续更新

指令 1 功能 备注 REM 注释 后面的提示可以回显,可以被@echo off关闭 :: 注释,不能回显 有效标号:冒号后紧跟一个以字母数字开头的字符串,goto语句可以识别.无效标号:冒号后紧跟一个非字母数字的一个特殊符号,goto无法识别的标号,可以起到注释作用,所以:: 常被用作注释符号,其实 :+ 也可起注释作用 echo 打开回显或关闭回显功能 on/off ,要关闭echo off 本身回显,加上@,将关闭该命令回显,无论此时echo是否为打开状态. echo. 输出一个空格 相当

Docker 村常用命令 (持续更新)

最近 用docker 搭建了项目环境.记录一下常用的docker命令 1. 搜索镜像:docker search redis redis :镜像名称  在docker 镜像库中搜索镜像 2. 拉取镜像:docker pull redis redis :镜像名称  拉去docker镜像 3.创建容器: docker run -p 6377:6379  --name myredis -v /root/redis/data:/data -d reids -p  宿主机端口:容器端口   将容器端口映射

sql常用函数---持续更新

1.SQL SERVER中的FLOAT转换为VARCHAR SELECT CAST(CAST(字段 AS DECIMAL(20,7)) AS VARCHAR(20)) FROM 要查的表 或者 SELECT CONVERT(VARCHAR(20),CONVERT(DECIMAL(20,7),字段)) FROM 要查的表 CAST   CONVERT   STR

linux 的常用命令(持续更新.....)

cp -a   相当于-dpR,保持文件的链接(d),保持原文件的属性(p)并作递归处理(R) -i    交互模式下会询问是否覆盖目标目录下的文件.使用 -i 选项,启用交互模式. cut -d选项的默认间隔符就是制表符,所以当你就是要使用制表符的时候,完全就可以省略-d选项,而直接用-f来取域就可以了. echo -n     #参数 -n 是最后不换行,echo默认是换行 -e     #如果有特殊字符,就进行特别处理 例如 \n   换行且光标移至行首 \t    插入 tab dd 1

docker-compose常用命令(持续更新...)

build 构建或重建服务 help 命令帮助 kill 杀掉容器 logs 显示容器的输出内容 port 打印绑定的开放端口 ps 显示容器 pull 拉取服务镜像 restart 重启服务 rm 删除停止的容器 run 运行一个一次性命令 scale 设置服务的容器数目 start 开启服务 stop 停止服务 up 创建并启动容器