1.7-1.14周报,关于一周的学习总结

Posted 小鱼儿12138

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1.7-1.14周报,关于一周的学习总结相关的知识,希望对你有一定的参考价值。

本周学习知识点:并查集,最短路,最小生成树,线段树,基础博弈论(巴什游戏,尼姆游戏,威佐夫,斐波那契),同余定理,扩展欧几里得,乘法逆元,线性筛,stl,欧拉定理,唯一分解定理,组合数学。

已掌握知识点:并查集,最小生成树,线段树,基础博弈论,同余定理,扩展欧几里得,乘法逆元,线性筛,组合数学(懂了个大概)。

并查集(disjoint set):合并+查找。查找就是找这个元素的根。合并就是在根与根之间建立关系,让他们拥有同一个根。三个函数:初始化+查找+合并

并查集的例题加题解。

算法打卡第一天——公司竞争(并查集)_ly14158的博客-CSDN博客

算法打卡第一天之——并查集(他自称是一道板子题,至于他是啥,咱也不知道)_ly14158的博客-CSDN博客

并查集+查找可以用来进行线段树的求解。

并查集+Kruskal:算法打卡第二天之——修复公路(并查集+Kruskal算法)_ly14158的博客-CSDN博客

线段树的算法:Kruskal +Prim算法。克鲁斯卡尔算法稍微掌握,但是Prim算法并未完全掌握。克鲁斯卡尔算法大致可以按照并查集+结构体排序。而线段树内部可以跟二分算法联系在一起。主要分为三个函数:build+query+modify。线段树可以用来解决单点修改和区间修改。在解决这类问题用到线段树的时候,一定要记得更新(pushup),而在区间修改的时候要记得修改值下放的函数(pushdown)。找最值的时候是直接更换值,而找区间和最大的则是叠加。

最后附上线段树的板子题。

#include<bits/stdc++.h>
#define N 900000
using namespace std;

int n;
int a[N];

struct tree
	int l,r;
	int sum;
	int mid()
		return (l+r)/2;
	
tre[N];

void pushup(int rt)

	tre[rt].sum=tre[rt*2].sum+tre[rt*2+1].sum;


void bulid(int rt,int l,int r)

	if(l==r)
		tre[rt]=l,r,a[l];
	else 
		tre[rt]=l,r;
		int mid=tre[rt].mid();
		bulid(rt*2,l,mid);
		bulid(rt*2+1,mid+1,r);
		pushup(rt);
	


int query(int rt,int l,int r)

	if(tre[rt].l>=l&&tre[rt].r<=r)
	
		return tre[rt].sum;
	else 
		int mid=tre[rt].mid();
		int ans=0;
		if(l<=mid)
		
			ans+=query(rt*2,l,r);
		if(r>mid)
		
			ans+=query(rt*2+1,l,r);
		return ans;
	


void modify(int rt,int x,int y)

	if(tre[rt].l==x&&tre[rt].r==x)
	
		tre[rt].sum+=y;
	else 
		int mid=tre[rt].mid();
		if(x<=mid)
		
			modify(rt*2,x,y);
		else 
			modify(rt*2+1,x,y);
		pushup(rt);
	

int main()

	int T,k=1;
	scanf("%d",&T);
	while(T--)
		printf("Case %d:\\n",k++);
		scanf("%d",&n);
		for(int i=1;i<=n;i++)
			scanf("%d",&a[i]);
		bulid(1,1,n);
		while(1)
			char op[2];
			int c,d;
			scanf("%s",op);
			if(op[0]=='E')
				break;
			scanf("%d %d",&c,&d);
			if(op[0]=='Q')
				printf("%d\\n",query(1,c,d));
			else if(op[0]=='A')
				modify(1,c,d);
			else if(op[0]=='S')
				modify(1,c,-d);
			
		
	return 0;

基础博弈论:直接放笔记吧。(字丑别骂)

 

 接下来就是数学的世界

 同余定理:如果a除以m得余数r,则a与r对m取模同余。每个整数必与0~(m-1)中的一个数字模m同余。

扩展欧几里得:是欧几里得算法(又叫辗转相除法)的扩展。已知整数a、b,扩展欧几里得算法可以在求得a、b的最大公约数的同时,能找到整数x、y(其中一个很可能是负数),使它们满足贝祖等式子ax+by=gcd(a,b);如果a是负数,可以把问题转化成|a|(-x)+by=gcd(|a|,b).,然后令x'=(-x)。

乘法逆元:是指数学领域群G中任意一个元素a,都在G中有唯一的逆元a‘,具有性质a×a'=a'×a=e,其中e为该群的单位元。

这就是这三个概念的定义,但是说归说,写出来倒没有那么复杂;使用了递归思想,代码就变简洁起来了。

线性筛:一个比埃式筛还要快的筛法。他的时间复杂度是O(n)。

isprime(int n)
    for(itn i=2;i<=N;i++)
        if(!num[i])
            prime[cnt++]=i;
            for(int j=1;j<=cnt&&i*prime[j]<=n;j++)
                num[i*prime[j]]=1;
                if(i%prime[j]==0)
                    break;
                   
                
            
        
    

 组合数学:主要是排列组合,其中还有卢卡斯定理。

剩下的还没有太理解,容我消化消化吧wwww

 

以上是关于1.7-1.14周报,关于一周的学习总结的主要内容,如果未能解决你的问题,请参考以下文章

一周的学习总结

一周的总结

一周的总结

日报周报月报工作总结生成器智能文案生成器

第二周周报

如何通过动态参数实现周报制作