2023寒假康复

本文概述了一周内涵盖的编程技术主题,包括素数筛选、字符串哈希、STL容器与迭代器、优先队列和贪心算法应用、图搜索算法(如DFS、BFS、拓补排序、Dijkstra等)、动态规划基础和数据结构(如双指针、单调栈和并查集)。
摘要由CSDN通过智能技术生成

Day1

OI WIKI

https://oi-wiki.org/
素数筛

https://oi-wiki.org/math/number-theory/sieve/
字符串哈希

https://oi-wiki.org/string/hash/
进制转换

https://oi-wiki.org/math/base/
高精度

https://oi-wiki.org/math/bignum/
逆元

https://zhuanlan.zhihu.com/p/449221995?utm_id=0


Day2

STL(很重要,必须要熟悉其用法)

queue,priority_queue,deque

stack

map,set

vector

关于STL的迭代器

deque <int> D ;
deque <int> :: iterator it ;
for( it = D.begin() ; it != it.end() ; ++ it )

不能直接使用迭代器相加减算出对应元素下标

deque<int> Q ;
int len = Q.end-Q.begin() ;

要查看对应STL的迭代器是否支持++,+,- 操作(一般只支持++)

priority_queue    存结构体,需要重载运算符

struct node {
    int to , w ;
    node( int To , int W ) {
        to = To ,  w = W ;
    }
}

bool operator < ( const node &a , const node &b ) {
    return a.w > b.w ;
}

void Prim() {
    priority_queue<node>Q ;
    Q.push( node(Start,dis[Start]) );
}

或者用pair,pair的first第一关键字,second 第二关键字

#define LL long long 
#define PLL pair<LL,LL>

priority_queue<PLL,vector<PLL>,greater<PLL>> Q ;
//  PLL 存储类型
// vector 底层实现的容器类型
// greater<PLL> 排序方式及排序的元素类型
Q.push(make_pair(a,b));


Day3

模拟(后面补)


Day4

二分(后面补)

二分主要可以分为二分查找和二分答案(都要求序列满足单调性

二分查找就大致是再一串序列中二分查找第一个大于常数x的元素

二分答案——答案满足单调性,二分答案,再把答案带入验证


Day5

贪心

邻项交换法

详细论述:

浅谈邻项交换排序的应用以及需要注意的问题 - ouuan的博客

简易理解:【流水调度问题】【邻项交换对比】【Johnson法则】洛谷P1080国王游戏/P1248加工生产调度/P2123皇后游戏/P1541爬山...-CSDN博客

进一步看 无后效性 , 最优子结构

关于流水调度:【动态规划】流水作业调度问题与Johnson法则_johnson规则寻找最优时间表-CSDN博客

简单的例题:牛牛叠罗汉(题解及邻项交换法解析:临项交换贪心例题-CSDN博客


Day6

图与搜索算法

有向图

无向图

欧拉路径

欧拉回路

回路

路径

DFS深度优先搜索

BFS宽度优先搜索


Day7

拓补排序,最短路

拓补排序

最短路

SPFA(可以有负边,能处理负环)

Dijstkra+堆优化(无负边)

void Dijkstera() {
	priority_queue< PLL , vector<PLL> , greater<PLL> > Q ;//用的pair
	bool vis[N] ;//表示已处理完成的集合
	memset( vis , 0 , sizeof(vis) );
	dis[1] = 0 ;//到起始点距离为0
	Q.push( make_pair(dis[1],1) ) ;//放入
	while( !Q.empty() ) {
		int x = Q.top().second ;//取出
		Q.pop() ;
		vis[x] = 1 ;//标记为已最优化集合
		for( int i = 0 ; i < G[x].size() ; ++ i ) {
			int son = G[x][i].second , w = G[x][i].first ;
			if( vis[son] ) continue ;//如果发现子节点已是最优化,就不再放入Q
			if( dis[son] > dis[x]+w ) {//能松弛
				dis[son] = dis[x]+w ;//松弛
				Q.push(make_pair(dis[son],son)) ;// 松弛后尝试松弛其子节点
			}
		}
	}
}

这里的vis与SPFA不同,Dj 的vis表示该点是否已经有最优最短路,有了就不用松弛

Dijstkra的最优子结构性相较于SPFA更明显,用到贪心的思想更好理解


Day8(后面补)

双指针,前缀和

前缀和:一维前缀和,二维前缀和,多为前缀和

差分


Day9(后面补)

单调栈,单调队列


Day10(后面补)

动态规划入门


Day11(后面补)

并查集和最小生成树

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值