noip模板复习
自己敲模板还是有很多容易错的地方
写在注释里面了
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模板复习的更多相关文章
- NOIP模板总结
NOIP模板总结 进考场先打一份缺省源: # include <cstdio> # include <iostream> # include <cstring> # ...
- wawawa8的模板复习计划
wawawa8的模板复习计划 数据结构 //手写堆 [link][https://www.luogu.org/problemnew/show/P3378] //并查集 [link][https://w ...
- NOIP前的模板复习和注意事项
联赛除去今天刚好只有一个星期了,最后一个星期也很关键,要吃好睡好保持心情愉悦.当然也免不了最后的复习计划. 首先是模板,之前还有很多模板没有复习到,这些东西是一定要落实到位的. 每天往后面写一点... ...
- NOIP考前复习-数制转换,数论模板与文件读写
数制转换有两种题型,一般一题,分值1.5分. 题型一:R进制转十进制 解法就是:按权展开,但要注意各个位的权,最低位(最右边)的权是0次方,权值为1. 纯整数的情况: (11010110)2 = 1× ...
- noip考前模板复习
网络流 Dinic(搭配飞行员) //Serene #include<algorithm> #include<iostream> #include<cstring> ...
- NOIp知识点复习——最短路计数
$Mingqi\_H$ NOIp 2017考挂了...gg 重新开始好了. 计划明年2月24号前复习完所有的NOIp知识点(毕竟很不熟练啊),之后到七月底前学习完省选的东西(flag?). 从现在开始 ...
- 11.7 NOIP总复习总结
好像要1A模板题.完败 下面主要是一波SB错误总结 最小生成树(忘了sort(QwQ)) // It is made by XZZ // Fei Fan Ya Xi Lie~~~ #include&l ...
- 模板复习【updating】
马上就要noi了……可能滚粗已经稳了……但是还是要复习模板啊 LCT: bzoj2049 1A 7min # include <stdio.h> # include <string. ...
- NOIP模板整理计划
先占个坑 [update]noip结束了,弃了 一.图论 1.单源最短路 洛谷P3371 (1)spfa 已加SLF优化 #include <iostream> #include < ...
随机推荐
- rnnlm源代码分析(八)
系列前言 參考文献: RNNLM - Recurrent Neural Network Language Modeling Toolkit(点此阅读) Recurrent neural networ ...
- javascript 使用方式
第一种:内嵌在html节点中 <html> <body> <input type="button" onclick="document.bo ...
- 运用smali自己主动注入技术分析android应用程序行为
如今android开发人员社区里,除了app开发外,还有非常多周边的工具类产品,比方安全.性能等,app产品 已经出现了巨无霸,可是工具类的产品.眼下还没有出现规模比較大的公司,大部分还处于创业阶段, ...
- 哈理工2015暑假集训 zoj 2975 Kinds of Fuwas
G - Kinds of Fuwas Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%lld & %llu Subm ...
- 好记性不如烂笔头——DML/DDL/DCL/TCL,OLTP/OLAP
DML:数据操作语言,就是增删改之类的语句 DDL:数据定义语言,创建.修改.删除表等 ALTER 语句 (Transact-SQL) CREATE 语句 (Transact-SQL) DISABLE ...
- bzoj3224: Tyvj 1728 普通平衡树(平衡树)
bzoj3224: Tyvj 1728 普通平衡树(平衡树) 总结 a. cout<<(x=3)<<endl;这句话输出的值是3,那么对应的,在splay操作中,当父亲不为0的 ...
- IJ:ALI OSS 配置
ylbtech-IJ:ALI OSS 配置 1. src/resources/返回顶部 1.src/resources/ 1.1.aliyunoss.properties # oss\u7684\u5 ...
- yii widget使用的3个用法
yii视图中使用的widget方式总结:常用的有3种方式:一.显示详细信息: $this->widget('zii.widgets.CDetailView', array( 'data' =&g ...
- DNS(域名系统)
DNS(Domain Name System),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的Ip数串.通过主机名,最终得到该主机 ...
- Python可迭代序列排序总结
列表排序 示例:lst = [12, 6, 1, 3, 10] 方法一:使用sort def list_sort(lst): lst.sort() # 就地排序,没有返回值 return lst 补充 ...