自己敲模板还是有很多容易错的地方

写在注释里面了

LCA

#include<bits/stdc++.h>
#define REP(i, a, b) for(register int i = (a); i < (b); i++)
#define _for(i, a, b) for(register int i = (a); i <= (b); i++)
using namespace std; const int N = 5e5 + ; //以后MAXN改成N。因为MAXM和MAXN不容易区分
const int M = ;
struct Edge{ int to, next; } e[N << ];
int head[N], tot, n, m, s;
int d[N], f[N][M + ]; //注意这里一定一定是M+10 void AddEdge(int from, int to)
{
e[tot] = Edge{to, head[from]};
head[from] = tot++;
} void dfs(int u, int fa) //dfs的作用是初始化f数组和d数组
{
for(int i = head[u]; ~i; i = e[i].next)
{
int v = e[i].to;
if(v == fa) continue;
d[v] = d[u] + ;
f[v][] = u;
dfs(v, u);
}
} void init()
{
f[s][] = s; //注意这里一定是自己的父亲为自己
dfs(s, -);
_for(j, , M) //注意这里是到M,不是N
_for(i, , n)
f[i][j] = f[f[i][j-]][j-];
} int lca(int u, int v)
{
if(d[u] < d[v]) swap(u, v); //u和v不要写反
for(int j = M; j >= ; j--) //逆序
if(d[f[u][j]] >= d[v]) //这里注意是深度的比较,u往上跳的深度和v本身的深度
u = f[u][j];
if(u == v) return u;
for(int j = M; j >= ; j--)
if(f[u][j] != f[v][j])
u = f[u][j], v = f[v][j];
return f[u][];
} int main()
{
memset(head, -, sizeof(head)); tot = ;
scanf("%d%d%d", &n, &m, &s);
REP(i, , n)
{
int u, v;
scanf("%d%d", &u, &v);
AddEdge(u, v); AddEdge(v, u);
} init(); //主函数里面不要忘了写
_for(i, , m)
{
int u, v;
scanf("%d%d", &u, &v);
printf("%d\n", lca(u, v));
} return ;
}

线段树

#include<bits/stdc++.h>
#define ls (k << 1)
#define rs (k << 1 | 1)
#define REP(i, a, b) for(register int i = (a); i < (b); i++)
#define _for(i, a, b) for(register int i = (a); i <= (b); i++)
using namespace std; typedef long long ll; //根据题目
const int N = 2e5 + ;
struct Segment_Tree
{
int l, r;
ll w, f;
int m() { return (l + r) >> ; }
int len() { return r - l + ; };
}t[N * ];
int n, q; inline void deal(int k, ll p)
{
t[k].f += p;
t[k].w += p * t[k].len();
} inline int up(int k)
{
t[k].w = t[ls].w + t[rs].w;
} inline void down(int k)
{
deal(ls, t[k].f);
deal(rs, t[k].f);
t[k].f = ;
} void build(int k, int l, int r)
{
t[k] = Segment_Tree{l, r, , };
if(l == r) { scanf("%lld", &t[k].w); return; }
int m = t[k].m();
build(ls, l, m);
build(rs, m + , r);
up(k);
} void add(int k, int x, ll p)
{
if(t[k].l == t[k].r) //注意这里一定是这么写,不能写t[k].l == x,这是错的
{
t[k].w += p;
return;
}
if(t[k].f) down(k);
int m = t[k].m();
if(x <= m) add(ls, x, p);
else add(rs, x, p);
up(k);
} void change(int k, int L, int R, ll p)
{
if(L <= t[k].l && t[k].r <= R) { deal(k, p); return; }
if(t[k].f) down(k);
int m = t[k].m();
if(L <= m) change(ls, L, R, p);
if(R > m) change(rs, L, R, p);
up(k);
} ll query(int k, int L, int R)
{
if(L <= t[k].l && t[k].r <= R) return t[k].w;
if(t[k].f) down(k);
int m = t[k].m(); ll res = ;
if(L <= m) res += query(ls, L, R);
if(R > m) res += query(rs, L, R);
return res;
} int main()
{
scanf("%d", &n);
build(, , n);
scanf("%d", &q);
while(q--)
{
int op, x, y; ll z;
scanf("%d", &op);
if(op == )
{
scanf("%d%d%lld", &x, &y, &z);
change(, x, y, z);
}
else
{
scanf("%d%d", &x, &y);
printf("%lld\n", query(, x, y));
}
}
return ;
}

KMP

#include<bits/stdc++.h>
#define REP(i, a, b) for(register int i = (a); i < (b); i++)
#define _for(i, a, b) for(register int i = (a); i <= (b); i++)
using namespace std; const int N = 1e6 + ;
char a[N], b[N];
int next[N], lena, lenb; void get_next()
{
next[] = ; int j = ; //注意这里从0开始。因为一开始匹配了0个
_for(i, , lenb) //这里的i从2开始
{
while(j && b[j + ] != b[i]) j = next[j];
if(b[j + ] == b[i]) j++;
next[i] = j;
}
} int main()
{
scanf("%s%s", a + , b + );
lena = strlen(a + ); lenb = strlen(b + );
get_next();
int j = ;
_for(i, , lena) //这里的i从1开始
{
while(j && b[j + ] != a[i]) j = next[j];
if(b[j + ] == a[i]) j++;
if(j == lenb) { printf("%d %d\n", i - lenb + , i); return ; }
}
puts("NO");
return ;
}

同余方程

#include<bits/stdc++.h>
#define REP(i, a, b) for(register int i = (a); i < (b); i++)
#define _for(i, a, b) for(register int i = (a); i <= (b); i++)
using namespace std; typedef long long ll;//如果考到数论题一定要开longlong!!!!!!!!
void exgcd(ll a, ll b, ll& d, ll& x, ll& y)
{
if(!b) { d = a; x = ; y = ; return; }
else { exgcd(b, a % b, d, y, x); y -= x * (a / b); }
} int main()
{
ll a, b, m;
scanf("%lld%lld%lld", &a, &b, &m);
ll A, B, K, d, x, y;
A = a, B = -m, K = b;
exgcd(A, B, d, x, y);
if(K % d) { puts("no solution!"); return ; }
x *= K / d; int mod = abs(B / d);
printf("%lld\n", (x % mod + mod) % mod);
return ;
}

同余方程组

#include<bits/stdc++.h>
#define REP(i, a, b) for(register int i = (a); i < (b); i++)
#define _for(i, a, b) for(register int i = (a); i <= (b); i++)
using namespace std; typedef long long ll;
void exgcd(ll a, ll b, ll& d, ll& x, ll& y)
{
if(!b) { d = a; x = ; y = ; return; }
else { exgcd(b, a % b, d, y, x); y -= x * (a / b); }
} int main()
{
int n;
ll b1, b2, m1, m2;
scanf("%d%lld%lld", &n, &b1, &m1);
REP(i, , n)
{
scanf("%lld%lld", &b2, &m2);
ll A, B, K, d, x, y;
A = m1, B = -m2, K = b2 - b1; //推出什么写什么
exgcd(A, B, d, x, y);
if(K % d) { puts("no solution!"); return ; } x *= K / d; int mod = abs(B / d); //注意这里加abs
x = (x % mod + mod) % mod;
b1 = b1 + m1 * x;
m1 = m1 * m2 / abs(d); //加abs
}
printf("%lld\n", b1);
return ;
}

欧拉函数

#include<bits/stdc++.h>
#define REP(i, a, b) for(register int i = (a); i < (b); i++)
#define _for(i, a, b) for(register int i = (a); i <= (b); i++)
using namespace std; typedef long long ll;
ll euler(ll x)
{
ll res = x; //注意区分res和x。x是用来取出因数的
for(int i = ; i * i <= x; i++)
if(x % i == )
{
res = res / i * (i - ); //先除后乘比较保险,可以这么做是因为i是res的因数
while(x % i == ) x /= i;
}
if(x > ) res = res / x * (x - );
return res;
} int main()
{
int n;
scanf("%d", &n);
_for(i, , n)
{
ll x; scanf("%lld", &x);
printf("%lld\n", euler(x));
}
return ;
}
//线性求法
const int N = 1e6 + ;
int euler[N];
void get_euler()
{
REP(i, , N) euler[i] = i;
REP(i, , N) //注意这里i从2开始。
if(euler[i] == i)
for(int j = i; j < N; j += i)
euler[j] = euler[j] / i * (i - );
}

线性筛素数

#include<bits/stdc++.h>
#define REP(i, a, b) for(register int i = (a); i < (b); i++)
#define _for(i, a, b) for(register int i = (a); i <= (b); i++)
using namespace std; const int N = 2e7 + ;
bool is_prime[N];
vector<int> prime; void get_prime()
{
memset(is_prime, true, sizeof(is_prime));
is_prime[] = is_prime[] = false;
REP(i, , N) //切记不能越界
{
if(is_prime[i]) prime.push_back(i);
REP(j, , prime.size())
{
if(i * prime[j] >= N) break; //切记不能越界
is_prime[i * prime[j]] = false;
if(i % prime[j] == ) break;
}
}
} int main()
{
get_prime();
int n;
scanf("%d", &n);
_for(i, , n)
{
int x; scanf("%d", &x);
printf("%d\n", prime[x-]);
}
return ;
}

组合数

const int N = 1e3 + ;
int c[N][N];
void init()
{
REP(i, , N) //从0开始
{
c[i][] = ;
_for(j, , i)
c[i][j] = c[i-][j] + c[i-][j-];
}
}

卡特兰数

f[] = ;
REP(i, , N) f[i] = f[i-] * ( * i - ) / (i + );

noip模板复习的更多相关文章

  1. NOIP模板总结

    NOIP模板总结 进考场先打一份缺省源: # include <cstdio> # include <iostream> # include <cstring> # ...

  2. wawawa8的模板复习计划

    wawawa8的模板复习计划 数据结构 //手写堆 [link][https://www.luogu.org/problemnew/show/P3378] //并查集 [link][https://w ...

  3. NOIP前的模板复习和注意事项

    联赛除去今天刚好只有一个星期了,最后一个星期也很关键,要吃好睡好保持心情愉悦.当然也免不了最后的复习计划. 首先是模板,之前还有很多模板没有复习到,这些东西是一定要落实到位的. 每天往后面写一点... ...

  4. NOIP考前复习-数制转换,数论模板与文件读写

    数制转换有两种题型,一般一题,分值1.5分. 题型一:R进制转十进制 解法就是:按权展开,但要注意各个位的权,最低位(最右边)的权是0次方,权值为1. 纯整数的情况: (11010110)2 = 1× ...

  5. noip考前模板复习

    网络流 Dinic(搭配飞行员) //Serene #include<algorithm> #include<iostream> #include<cstring> ...

  6. NOIp知识点复习——最短路计数

    $Mingqi\_H$ NOIp 2017考挂了...gg 重新开始好了. 计划明年2月24号前复习完所有的NOIp知识点(毕竟很不熟练啊),之后到七月底前学习完省选的东西(flag?). 从现在开始 ...

  7. 11.7 NOIP总复习总结

    好像要1A模板题.完败 下面主要是一波SB错误总结 最小生成树(忘了sort(QwQ)) // It is made by XZZ // Fei Fan Ya Xi Lie~~~ #include&l ...

  8. 模板复习【updating】

    马上就要noi了……可能滚粗已经稳了……但是还是要复习模板啊 LCT: bzoj2049 1A 7min # include <stdio.h> # include <string. ...

  9. NOIP模板整理计划

    先占个坑 [update]noip结束了,弃了 一.图论 1.单源最短路 洛谷P3371 (1)spfa 已加SLF优化 #include <iostream> #include < ...

随机推荐

  1. 分享微软官方Demo用的SharePoint 2010, Exchange 2010, Lync 2010虚拟机

    微软官方有一套专门用于SharePoint 2010, Exchange 2010 Demo的虚拟机:SharePoint 2010: Information Worker Demonstration ...

  2. oracle Plsql 运行update或者delete时卡死问题解决的方法

    oracle Plsql 运行update或者delete时 遇到过Plsql卡死问题或者导致代码运行sql的时候就卡死. 在开发中遇到此问题的时候,本来把sql复制出来,在plsql中运行,Sql本 ...

  3. 移动互联网App推广的十大难题

    常常有朋友来问."我做了一个App,请问怎么推广啊?"或者就是"我们公司开发了一个App.想短时间内获取巨大的量."还有的就是问"有没有什么好渠道三个 ...

  4. 没有终结点在侦听可以接受消息的 http://192.168.1.63:8085/LoginService。这通常是由于不正确的地址或者 SOAP 操作导致的

    2016-04-08 09:15:05,581 [8] ERROR System.Threading.Thread - ErrorSystem.ServiceModel.EndpointNotFoun ...

  5. 74.资金管理-员工工资配置 extjs 页面

    1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8&quo ...

  6. JVM内存模型和GC垃圾回收

    JVM 内存区域 1.程序计数器 这是一块较小的内存空间,它的作用可以看做是当前线程所执行的字节码的行号指示器,指的是上次代码被执行的地方,线程私有. 2.Java 虚拟机栈 它是 Java方法执行的 ...

  7. BZOJ 4010 拓扑排序+heap

    思路: 反向图求最大拓扑序 反向输出 //By SiriusRen #include <queue> #include <cstdio> #include <cstrin ...

  8. Redis学习笔记(二)-key相关命令

    Redis支持的各种数据类型包括string,list ,set ,sorted set 和hash . Redis本质上一个key-value db,所以我们首先来看看他的key.首先key也是字符 ...

  9. SQLCE本地数据库

    SQLCE是一个标准得关系数据库,可以使用 LINQ 和DateContext来处理本地数据库数据库. 使用SQLCE 要在代码中使用本地数据库功能,需要添加以下命名空间 : using System ...

  10. Laravel5.1学习笔记5 请求

    HTTP 请求 #取得请求实例 #基本的请求信息 #PSR-7 请求 #取出输入数据 #旧的输入 #Cookies #文件 #取得请求实例(此部分文档5.1完全重写,注意) 要通过依赖注入获取当前HT ...