安排

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部分图论

图论知识薄弱,这部分甚至可以算是新学了,如果还有时间要往后学,还要留时间总结

基环树 负环与差分约束 Tarjan算法与连通图

备选学习知识 二分图 网络流

11.12 普通DP专练

线性DP 背包 区间DP 树形DP 状压DP

11.13 DP优化学习与练习

倍增优化 数据结构优化 单调队列优化 斜率优化

后面不知道有没有时间了,时间有点紧

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

BIGBIGPPT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值