算法学习

摘要

发现前面学的东西都忘得差不多了,想复习也找不到原来写的题了,所以从今天开始记录一下学习算法的足迹。

基础算法

二分

Codeforces Round #686 (Div. 3) F. Array Partition
求满足 m a x ( 1 , x ) = m i n ( x + 1 , y ) = m a x ( y + 1 , n ) max(1,x)=min(x+1,y)=max(y+1,n) max(1,x)=min(x+1,y)=max(y+1,n) l e n 1 = x , l e n 2 = y − x , l e n 3 = n − y len1=x,len2=y-x,len3=n-y len1=x,len2=yx,len3=ny 。根据 m i n min min m a x max max具有二分的性质,直接在二分的时候判断两个条件来调整 l , r l,r l,r即可。

倍增

Codeforces Round #717 (Div. 2) D. Cut 倍增
一个比较巧妙的在序列上的倍增,启发了能跳一步,就可以用二进制倍增一下子跳很多步。

前缀和

Codeforces Round #619 (Div. 2) E. Nanosoft 思维 + 二维前缀和

构造

Codeforces Round #606 (Div. 2, based on Technocup 2020 Elimination Round 4)
根据 x = ( x + 1 )   m o d   a , y = ( y + 1 )   m o d   b x=(x+1)\bmod a,y=(y+1)\bmod b x=(x+1)moda,y=(y+1)modb的方式来构造每个点所在的每行每列都不相等的矩阵。
Codeforces Round #712 (Div. 2) D. 3-Coloring 交互 构造
奇偶构造,让后第三种颜色放非空的位置。
Codeforces Round #609 (Div. 2) D. Domino for Young 黑白染色
进行黑白染色,可以将 1 × 2 1×2 1×2的多米诺骨牌进行匹配,答案为小的那个颜色。
Codeforces Round #619 (Div. 2) D. Time to Run 矩阵回路构造

图论

bfs

Codeforces Round #619 (Div. 2) F. Super Jaber 多源bfs + 思维转换

dfs\dfs序

P3605 [USACO17JAN]Promotion Counting P
配合树状数组解决一类子树统计问题,比如这个题就是统计 p j > p i p_j>p_i pj>pi的个数。

Codeforces Round #606 (Div. 2, based on Technocup 2020 Elimination Round 4)
模型抽象 + 问题转化。

同余最短路

通常伪装成一类数论题。

跳楼机
板子题,用 x , y , z x,y,z x,y,z组成 h h h

墨墨的等式
板子题,看到这一类的式子应该很快想到同余最短路,让后将 [ l , r ] [l,r] [l,r]的区间转化为前缀区间即可。

GYM Sums
上一题的简化版,这个题只问了能否组成 x x x,那么只需要 x > = d i s [ x   m o d   b a s e ] x>=dis[x\bmod base] x>=dis[xmodbase]即可。

Lazy Running HDU - 6071 好题
分层 + 同余最短路

差分约束

E. Capitalism
根据 a j = a i + 1 a_j=a_i+1 aj=ai+1构造不等式,让后判断是否有负环,且由于这个题的特殊性,还要判断是否为二分图。

LCA

Codeforces Round #620 (Div. 2) E. 1-Trees and Queries 思维 + LCA
比较巧妙的一个题,多加一条边可能改变路径的奇偶性。

基环树

Codeforces Round #686 (Div. 3) E. Number of Simple Paths
基环树,求路径长度 > = 1 >=1 >=1的路径个数。用总情况 n ∗ ( n − 1 ) n*(n-1) n(n1)减去在一棵树的情况 s e [ i ] ∗ ( s e [ i ] − 1 ) / 2 se[i]*(se[i]-1)/2 se[i](se[i]1)/2即为答案。

dp

线性dp

E2. Square-free division (hard version) 题解
预处理出来 l e f t left left数组方便找能转移的位置,让后直接dp转移就行啦。

概率期望

P5104 红包发红包
w w w的红包,第 k k k个人抢到的钱的期望为 w 2 k \frac{w}{2^k} 2kw

游走
在DAG上路径长度的期望, f [ i ] f[i] f[i]表示到 i i i这个点的总长度, g [ i ] g[i] g[i]表示到 i i i这个点路径的总个数。

Codeforces Round #604 (Div. 2) E. Beautiful Mirrors 题解
1 1 1走到 n n n,失败了就回 1 1 1号点,求到 n n n期望步数。主要理解一下回到起点的一部分。
f [ i ] = ( f [ i − 1 ] + 1 ) ∗ p i 100 + ( f [ i − 1 ] + f [ i ] + 1 ) ∗ 100 − p i 100 f[i]=(f[i-1]+1)*\frac{p_i}{100}+(f[i-1]+f[i]+1)*\frac{100-p_i}{100} f[i]=(f[i1]+1)100pi+(f[i1]+f[i]+1)100100pi

SP1026 FAVDICE - Favorite Dice
一个n面的骰子,求期望掷几次能使得每一面都被掷到。求出概率,让后期望=1/概率得出答案即可。

绿豆蛙的归宿
基础期望dp,建反图逆推就好啦。

CF1042E Vasya and Magic Matrix
列出普通式子,让后把平方拆开,维护一下变量 O ( 1 ) O(1) O(1)转移即可。

背包dp

AT F - Potion
f [ i ] [ j ] [ k ] f[i][j][k] f[i][j][k]表示前 i i i个数选了 j j j个且   m o d      l e n \bmod \ \ len mod  len k k k

树形dp

Codeforces Round #701 (Div. 2) E. Move and Swap 思维 + dp
去绝对值优化转移。

数位dp

AtCoder Beginner Contest 194 F - Digits Paradise in Hexadecimal
比较裸的数位 d p dp dp了,说一下状态吧:设 d p [ p o s ] [ s t a t e ] [ f l a g ] [ l e a d ] dp[pos][state][flag][lead] dp[pos][state][flag][lead]为到了 p o s pos pos位置,状态为 s t a t e state state,是否能枚举到上界 f l a g flag flag,以及是否存在前导零 l e a d lead lead

Palindromic Numbers LightOJ - 1205
用数位 d p dp dp [ l , r ] [l,r] [l,r]有多少个回文数。我们只需要记一下每次选的数,让后 d p dp dp状态设计加上回文开始的位置 p r e pre pre以及当前是否为回文就可以表征出这个数字的状态了。

状压dp

Educational Codeforces Round 80 (Rated for Div. 2) 二分 + 状压
O ( n ∗ 2 n ) O(n*2^n) O(n2n)递推子集。
Codeforces Round #622 (Div. 2) D. Happy New Year 状压dp
根据区间涉及状态,将区间离散化,成为左闭右开的区间,信息都存在左端点,先删后加。

区间dp

Codeforces Round #715 (Div. 2) C. The Sports Festival 区间dp
a a a数组排序之后就是个裸的区间 d p dp dp了,可以只从两头转移,复杂度优化成 O ( N 2 ) O(N^2) O(N2)

计数dp

Educational Codeforces Round 81 (Rated for Div. 2) F.Good Contest \ 洛谷 划艇 组合 计数dp

数据结构优化dp

Educational Codeforces Round 81 (Rated for Div. 2) E. Permutation Separation 线段树 + dp
通过线段树区间加法,以及维护全局最小值,可以优化 d p dp dp过程。
Codeforces Round #620 (Div. 2) F2. Animal Observation (hard version) dp + 线段树
优化区间转移。

数据结构

树上启发式合并

CodeForces - 208E Blood Cousins
树启板子,将原本询问与 x x x p p p级祖先相同的个数转化成祖先的 p p p级儿子有几个,减一即为答案。把询问存到每个点上,维护一下子树的 d e p t h depth depth,更新即可。

CodeForces - 570D Tree Requests
每次询问 v v v对应的子树中,深度为 h h h的这层节点的字母,能否打乱重排组成回文串。定义一个 c [ i ] [ j ] c[i][j] c[i][j]表示深度为 i i i,字母 j + ′ a ′ j+'a' j+a有几个,让后在定义一个 f l a g [ i ] flag[i] flag[i]表示深度为 i i i有几个字母出现了奇数次,让后当 f l a g [ i ] < = 1 flag[i]<=1 flag[i]<=1的时候可以,否则不可以。

CodeForces - 600E Lomsat gelral
问子树中出现次数最多的节点编号之和。经典入门题了,不多说。

CodeForces - 1009F Dominant Indices
d ( u , i ) d(u,i) d(u,i)表示 u u u子树到 u u u距离为 i i i的个数,对每个 u u u求最小 k k k使得 d ( u , k ) d(u,k) d(u,k)最大。定义一个 c n t [ i ] cnt[i] cnt[i],让后更新 i d id id即可。最后删除子树的时候不要忘记更新 m a x max max i d id id 0 0 0

CodeForces - 375D Tree and Queries 题解 好题
c n t cnt cnt维护 > = k j >=k_j >=kj的颜色个数,可以省掉一层 l o g n logn logn

2019 ICPC Asia Nanchang Regional K.Tree
树启 + 动态开点。

CF741D Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths
树启 + 状压 好题。需要用到 d s u dsu dsu遍历的顺序,先遍历轻儿子,清空轻儿子,才遍历重儿子,所以修改全局的值不会影响到后来遍历的重儿子的值。

主席树

主席树求mex
维护每个数最后出现的位置,在第 r r r棵树上找出现位置 < l <l <l的最小值即可。
2016中国大学生程序设计竞赛(长春)Sequence II HDU - 5919
主席树维护第一次出现的位置,维护区间和,倒着插入即可。
Prefix HDU - 5790 字典树 + 主席树
维护每个前缀最后出现的位置,查询区间和即可。
P2839 [国家集训队]middle 二分 + 主席树 在值域上建区间
中位数建主席树,优化递推求每次的区间。
P3899 [湖南集训]谈笑风生 主席树解决二维数点
d f s dfs dfs序上建树,让后转换成一个深度区间和一个 d f s dfs dfs序区间,以深度为下标建立主席树即可。
P3293 [SCOI2016]美味 主席树 + 伪01trie
利用01trie的思想,将树上贪心转换成区间贪心,每次都可以转换成区间询问,让后根据询问结果更新答案即可。
Codeforces Round #716 (Div. 2) D. Cut and Stick 主席树 + 思维
主席树查询区间是否存在出现次数大于 n / 2 n/2 n/2的数。

Splay

线段树分治

二分图\模板
将每个边出现的时间在线段树上划分成 l o g n logn logn段,让后用可撤销并查集维护就好啦。

CF981E Addition on Segments 线段树分治 + bitset优化 题解
将询问区间分成 l o g n logn logn段,让后从根遍历到最后只有一个点的时候保证了这个点可以成为最大值,因为所有区间都包含这个点,让后每次用 b i t s e t bitset bitset的左移操作将其加 x x x即可。

Kruskal重构树

目前做的题都比较套路,维护边权 ≤ w \le w w能到的连通块。
Network 黑暗爆炸 - 3732 倍增lca || Kruskal重构树
两点的 l c a lca lca即为最大边。
Peaks加强版 黑暗爆炸 - 3551 Kruskal重构树 + 主席树
找到连通块,dfs序处理一下,即为查询块第 k k k大。
P4768 [NOI2018] 归程 Kruskal重构树 + 倍增 + 最短路
最短路预处理。

数论

基础数论

HDU - 4497 GCD and LCM
给三个数的 l c m lcm lcm g c d gcd gcd,求满足条件的 ( x , y , z ) (x,y,z) (x,y,z)个数。经典套路把 ( x , y , z ) (x,y,z) (x,y,z)都除个 g c d ( x , y , z ) gcd(x,y,z) gcd(x,y,z),让后对 l c m ( x , y , z ) g c d ( x , y , z ) \frac{lcm(x,y,z)}{gcd(x,y,z)} gcd(x,y,z)lcm(x,y,z)分解质因子统计数量即可。

Educational Codeforces Round 106 (Rated for Div. 2) D. The Number of Pairs
方法同上,只不过给了个式子没有那么明显。只需要让 l c m ( x , y ) = k ∗ g c d ( x , y ) lcm(x,y)=k*gcd(x,y) lcm(x,y)=kgcd(x,y),再进行化简式子就好啦。

Educational Codeforces Round 81 (Rated for Div. 2) D. Same GCDs 欧拉函数
a , m a,m a,m都除 g c d ( a , m ) gcd(a,m) gcd(a,m)之后,答案即为 m g c d ( a , m ) \frac{m}{gcd(a,m)} gcd(a,m)m的欧拉函数。

本项目是一个基于SSM(Spring+SpringMVC+MyBatis)框架和Vue.js前端技术的大学生第二课堂系统,旨在为大学生提供一个便捷、高效的学习和实践平台。项目包含了完整的数据库设计、后端Java代码实现以及前端Vue.js页面展示,适合计算机相关专业的毕设学生和需要进行项目实战练习的Java学习者。 在功能方面,系统主要实现了以下几个模块:用户管理、课程管理、活动管理、成绩管理和通知公告。用户管理模块支持学生和教师的注册、登录及权限管理;课程管理模块允许教师上传课程资料、设置课程时间,并由学生进行选课;活动管理模块提供了活动发布、报名和签到功能,鼓励学生参与课外实践活动;成绩管理模块则用于记录和查询学生的课程成绩和活动参与情况;通知公告模块则实时发布学校或班级的最新通知和公告。 技术实现上,后端采用SSM框架进行开发,Spring负责业务逻辑层,SpringMVC处理Web请求,MyBatis进行数据库操作,确保了系统的稳定性和扩展性。前端则使用Vue.js框架,结合Axios进行数据请求,实现了前后端分离,提升了用户体验和开发效率。 该项目不仅提供了完整的源代码和相关文档,还包括了详细的数据库设计文档和项目部署指南,为学习和实践提供了便利。对于基础较好的学习者,可以根据自己的需求在此基础上进行功能扩展和优化,进一步提升自己的技术水平和项目实战能力。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值