赛前复习
11.04 搜索专题复习
树与图的遍历 深搜 剪枝 迭代 广搜
#include<bits/stdc++.h>
#define ll long long
#define MAXN 5000100
#define N 1001
#define INF 0x3f3f3f3f
#define gtc() getchar()
using namespace std;
template <class T>
inline void read(T &s){
s = 0; T w = 1, ch = gtc();
while(!isdigit(ch)){if(ch == '-') w = -1; ch = gtc();}
while(isdigit(ch)){s = s * 10 + ch - '0'; ch = gtc();}
s *= w;
}
template <class T>
inline void write(T x){
if(x < 0) putchar('-'), x = -x;
if(x > 9) write(x/10);
putchar(x % 10 + '0');
}
struct node{
int x, y;
}e[MAXN<<1];
int lin[MAXN<<1], len = 0;
inline void add(int x, int y){
e[++len].y = y, e[len].ne = lin[x], lin[x] = len;
}
int v[MAXN];
void dfs1(int x){//树的遍历
v[x] = 1;
for(int i = lin[x]; i ; i = e[i].ne){
int y = e[i].y;
if(v[y]) continue;
dfs(y);
}
}
int df[MAXN], len = 0;//求dfs序
void dfs2(int x){
df[++len] = x;
v[x] = 1;
for(int i = lin[x]; i; i = e[i].ne;){
int y = e[i].y;
if(v[y]) continue;
dfs(y);
}
a[++len] = x;
}
int dep[MAXN];//找深度
void dfs3(int x){
v[x] = 1;
for(int i = lin[x]; i; i = e[i].ne;){
int y = e[i].y;
if(v[y]) continue;
dep[y] = dep[x] + 1;
dfs(y);
}
}
int size[MAXN], zx;//找重心
void dfs4(int x){
v[x] = 1, size[x] = 1;
int max_part = 0;
for(int i = lin[x]; i; i = e[i].ne;){
int y = e[i].y;
if(v[y]) continue;
dfs(y);
size[x] += size[y];
max_part = max(max_part, size[y]);
}
max_part = max(max_part, n - szie[x]);
if(ans > max_part){
ans = max_part;
zx = x;
}
}
int cnt = 0;//连通块染色
void dfs5(int x){
v[x] = cnt;
for(int i = lin[x]; i; i = e[i].ne;){
int y = e[i].y;
if(v[y]) continue;
dfs(y);
}
}
void find(){
for(int i = 1; i <= n; ++i){
if(!v[i]){
++cnt; dfs(i);
}
}
}
void bfs(){//广搜遍历
memset(dep, 0, sizeof(dep));
queue<int> q;
q.push(1), dep[1] = 1;
while(!q.empty()){
int x = q.front(); q.pop();
for(int i = lin[x]; i; i = e[i].ne){
int y = e[i].y;
if(dep[y]) contniue;
dep[y] = dep[x] + 1;
q.push(y);
}
}
}
int in[MAXN], tps[MAXN];//拓扑排序
void topsort(){
queue<int> q;
for(int i = 1; i <= n; ++i){
if(!in[i]) q.push(i);
}
while(!q.empty())[
int x = q.front(); q.pop();
tps[++cnt] = x;
for(int i = lin[x]; i; i = e[i].ne;){
int y = e[i].y;
if(--in[y] == 0) q.push(y);
}
}
}
int main()
{
read(n), read(m);
for(int i = 1; i <= m; ++i){
int x, y;
read(x), read(y);
add(x, y), add(y, x);
}
return 0;
}
11.05 搜索进阶
广搜变形 IDA*(尝试)
11.06 部分基本数据结构
栈 队列 链表与邻接表 hash 字符串
单调栈
#include<bits/stdc++.h>
#define ll long long
#define MAXN 1000100
#define N 1001
#define INF 0x3f3f3f3f
#define gtc() getchar()
using namespace std;
template <class T>
inline void read(T &s){
s = 0; T w = 1, ch = gtc();
while(!isdigit(ch)){if(ch == '-') w = -1; ch = gtc();}
while(isdigit(ch)){s = s * 10 + ch - '0'; ch = gtc();}
s *= w;
}
template <class T>
inline void write(T x){
if(x < 0) putchar('-'), x = -x;
if(x > 9) write(x/10);
putchar(x % 10 + '0');
}
ll stk[MAXN];
ll a[MAXN];
int n, cnt = 0, p = 0;
ll ans = 0;
int t;
ll w[MAXN];
int main()
{
while(scanf("%d", &n) && n){
ans = 0, cnt = 0;
memset(a, 0, sizeof(a));
memset(stk, 0, sizeof(stk));
a[n+1] = 0;
for(int i = 1; i <= n+1; ++i){
if(i <= n) read(a[i]);
if(a[i] > stk[cnt]){
stk[++cnt] = a[i]; w[cnt] = 1;
}
else {
ll wight = 0;
while(stk[cnt] > a[i]){
wight += w[cnt];
ans = max(ans, wight * stk[cnt]);
--cnt;
}
stk[++cnt] = a[i], w[cnt] = wight+1;
}
}
cout << ans << endl;
}
return 0;
}
单调队列
#include<bits/stdc++.h>
#define ll long long
#define MAXN 5000100
#define N 1001
#define INF 0x3f3f3f3f
#define gtc() getchar()
using namespace std;
template <class T>
inline void read(T &s){
s = 0; T w = 1, ch = gtc();
while(!isdigit(ch)){if(ch == '-') w = -1; ch = gtc();}
while(isdigit(ch)){s = s * 10 + ch - '0'; ch = gtc();}
s *= w;
}
template <class T>
inline void write(T x){
if(x < 0) putchar('-'), x = -x;
if(x > 9) write(x/10);
putchar(x % 10 + '0');
}
int n, m;
struct node{
int w, id;
}a[MAXN];
deque<node> q;
int qu[MAXN];
int main()
{
read(n), read(m);
for(int i = 1; i <= n; ++i){
read(a[i].w), a[i].id = i;
}
qu[1] = 0;
for(int i = 1; i < n; ++i){
while(!q.empty() && q.back().w >= a[i].w) q.pop_back();
q.push_back(a[i]);
while(!q.empty() && q.front().id < i-m+1) q.pop_front();
qu[i] = q.front().w;
}
for(int i = 0; i < n; ++i){
write(qu[i]); puts("");
}
return 0;
}
11.07 部分基本数据结构
Trie 二叉堆
11.08 部分基本算法
二分 排序 倍增 贪心
11.09 部分进阶数据结构
并查集 树状数组 线段树 AC自动机
11.10 基础图论
最短路 最小生成树 直径与LCA
11.11部分图论
图论知识薄弱,这部分甚至可以算是新学了,如果还有时间要往后学,还要留时间总结