感觉自己真的好菜啊,要继续学新算法了qwq,然后因为要二检时间并不是很多了。

5.1

BZOJ1101——Math——Mobius

5.3

LGP3644——Data_Structure——Balanced_Binary_Tree——Splay
LGP3645——Map——Shortest_Way——SPFA

5.4

BZOJ3206——Map——MST
BZOJ4585——Others——Convex_Hull
LGP3622——DP——Compression

5.5

BZOJ3676——String——manacher+DA

5.6

BZOJ4804——Math——Phi
BZOJ3064——Data_Structure——Segment_Tree
LGP3629——Others——Miscellaneous

5.7

BZOJ4530——Data_Structure——LCT
BZOJ4561——Data_Structure——Balanced_Binary_Tree——Splay
CF632E——Math——FFT
LGP2570——Map——Network_Flow——Cost_Flow——Common
LGP3647——DP——Tree
POJ2069——Others——Simulated_Annealing
UOJ26——Others——Interactive

5.8

LGP3401——Data_Structure——Heavy_Light_Cut+Segment_Tree

5.15

BZOJ4919——DP——Data_Structure——Segment_Tree

5.16

BZOJ4066——Data_Structure——KD_Tree

以上都没有贴题解qwq,比较好的一些题会放在博客里面的。

比较有空就贴上题解。

5.17

BZOJ3489——Data_Structure——KD_Tree
KDT的正确姿势,在传统数据结构题中的妙用。
我们记录每一个点为一个三元组(x,pre,nex)表示当前点位置在x,前一个和它相同的数位置在pre,后一个在nex。
那么对于每个询问我们要找的就是l<=x<=r,pre

5.18

BZOJ2565——String——PAM
求最长双回文串嘛,上PAM。
正串和反串各做一次PAM,记录答案即可。

CC_CUTTREE——Math——FFT/Divide_Conquer——Point_Divide
题解

URAL2040——String——PAM
PAM模板题

接下来就没有机会去机房了,要准备二检。(班主任暴怒了)
然后这两周文化课的间隙就看一些论文好了,学习一些新姿势qwq。

5.21

不要问我为什么写了题。

CC_PRIMEDST——Math——FFT/Divide_Conquer——Point_Divide
模板题不解释了。

HDU5785——String——PAM
首先如果我们求不重叠回文子串的对数那么回文树中,num[now]表示添加该字符后新产生的回文串个数,即以该字符为结尾的回文串个数,num[now] = num[fail[now]]+1
正着跑一次,同时求出num的前缀和,再反着跑一次,同时累加prefixSum[i-1]*suffixSum[i]即可

这道题中则要求以该字符为结尾的回文串的起始坐标和,不方便直接维护和递推
后来想到,sum[now]表示以该字符为结尾的回文串长度和,则sum[now] = sum[fail[now]] + len[now]
则 (pos[now]+1)*num[now] - sum[now] 即是起始坐标和,反着跑时也可以类似的求出终止坐标和,相乘累加即可

总是在不可名状的地方爆了long long

6.1

没什么时间更新博客了,各种课程十分乱,文化课真难qwq。

BZOJ1898——DP——Matrix
算出每12步的矩阵,做矩阵乘法。其余的再单独暴力。

6.2

BZOJ3270——Math——Gauss
列出方程高斯消元即可。

CF975E——Calc_Geometry——Barycentre
发现每次旋转的特性是和重心有关,且最后重心与固定点的直线垂直地面。
这样我们只需要维护重心的位置以及到每一个角的大小就可以了(事实上角的大小是预处理)

6.5

CF986A——Map——BFS
对于每种颜色跑一次bfs。

6.7

CF983D——Others——Scan_Lines
题解

CF986D——Math——FFT
经过一番推敲,发现答案一定是尽量多选三,最后会有2∗3x,3∗3x,4∗3x2∗3x,3∗3x,4∗3x2*3^x,3*3^x,4*3^x三种情况。
怎么求出这个xxx?用换底公式,其实就变成了x&lt;=log3(n)=len(n)∗log3(10)" role="presentation">x<=log3(n)=len(n)∗log3(10)x<=log3(n)=len(n)∗log3(10)x,后面这个东西按计算器就行了233,当然c++自带也可以。
之后的计算就是一个FFT+快速幂。

6.8

BZOJ4832——Math——Probability&Expectation
这个题目顺着做很好想,设
f(i,a,b,c) 表示 攻击了i次 奴隶主中血量为1的有a个 血量为2的有b个 血量为3的有c个 英雄所受伤害的 期望
g(i,a,b,c) 表示 达到这个状态的 概率
然后随便转移一下就可以了。
上面方法使用的是期望=概率*权值,因此我们需要维护概率。

但是这类问题还又一种写起来很简短的做法,设
f(i,a,b,c)表示攻击还剩i次…的期望,相当于把整幅图反了过来,变成了一幅拓扑图进行递推,就只用维护期望了。

其实这种方法在数学期望里是经常用到的,即将“已经x次”变成“还剩x次”。

6.9

BZOJ1040——Map——Circle_Tree
环套树练习。
如果只是一棵树,我们只需以其中一个点为根进行简单dp即可。
现在是一棵环套树,我们可以将环上的其中一条边断掉,对这条边连接的两个点分别作一次不选的dp取最大值即可。

CF455E——DP——Slope
题意很简短,f[1,j]=a[j],f[i,j]=min(f[i−1,j],f[i−1,j−1])+a[j]f[1,j]=a[j],f[i,j]=min(f[i−1,j],f[i−1,j−1])+a[j]f[1,j]=a[j],f[i,j]=min(f[i-1,j],f[i-1,j-1])+a[j],多个询问求f[x,y]f[x,y]f[x,y]
很容易发现答案一定是一段横着走加一段斜着走,考虑f[1,i]f[1,i]f[1,i]对f[x,y]f[x,y]f[x,y]的贡献,那么就是:
(x−(y−i))∗a[i]+sum[y]−sum[i](x−(y−i))∗a[i]+sum[y]−sum[i](x-(y-i))*a[i]+sum[y]-sum[i],其中sum[i]=∑ij=1a[j]sum[i]=∑j=1ia[j]sum[i]=\sum_{j=1}^i a[j]
然后按照斜率优化搞一搞,得到iii比j" role="presentation">jjj优时:
(x−y)∗a[i]+i∗a[i]−sum[i]<(x−y)∗a[j]+j∗a[j]−sum[j](x−y)∗a[i]+i∗a[i]−sum[i]<(x−y)∗a[j]+j∗a[j]−sum[j](x-y)*a[i]+i*a[i]-sum[i]
这样每个点就是(a[i],−sum[i]+a[i]∗i)(a[i],−sum[i]+a[i]∗i)(a[i],-sum[i]+a[i]*i)
求最小值的话我们维护一个下凸壳就行了,在凸包上二分即可。

CF689C——Math——Probability&Expectation
10^100可以近似看作INF了,这样到最后k个缓存一定都是放满的(如果有0的概率特判来做什么的就行了)
这样将问题倒过来,转化为如果第i个视频没有放进去,那么以概率pi放进缓存,当缓存中视频数为k时停止,问每个视频出现概率。
n很小可以考虑状压,对于当前状态now,若nownownow&(1<<i)==0则f[now|(1<<i)]+=f[now]∗p[i]/tot(1<<i)==0则f[now|(1<<i)]+=f[now]∗p[i]/tot(1,其中tot表示没有出现在now中视频p的和。
最后的话就统计一下1的个数为k的二进制概率累加答案什么的。

LOJ516——Data_Structure——Balanced_Binary_Tree——Set
启发式合并set

6.11

BZOJ3672——DP——Slope
题解

BZOJ3242——Map——Circle_Tree
考虑答案的性质,如果这幅图是一棵树,那么答案显然就是树的直径。
现在是一棵基环树,如果答案不经过环,那么答案就是所有外向树的直径的最大值。
考虑经过环的答案,路径一定是形如x_son->x->y->y_son的,因此我们可以尝试去掉环上的一条边,这样就变成了一个区间问题。
如果我们枚举去掉的是环上的哪条边,可以很容易得到答案。
但现在问题在于,依次去掉环上的边,如何快速求出直径?
假设现在有一个4的环,我们写成1-2-3-4-1-2-3-4的套路形式。
设dis_i为节点i到链起点点的长度,,dep_i表示树深度那么答案就是max{dis_i-dis_j+dep_i+dep_j}(j

6.12

BZOJ4814——Others——Segment_Division
看到序列上的拆入删除操作,想起APIO的线段树分治。(事实上也确实是为了练这个)
为了避免删除操作,我们记录每个点的加入和删除时间。
线段树分治实际上就是相当于在每一个节点打一个标记,表示这个节点表示的时间内有哪些操作
最后我们只需要dfs一遍线段树就行了。

LOJ2585——Data_Structure——Segment_Tree&Splay/Segment_Division
题解

6.13

BZOJ1095——Divide_Conquer——Dynamic_Divide
先考虑没有开关灯的操作,我们可以直接用一个点分治来完成。
现在有开关灯,考虑利用点分治的性质完成。
我们将分治过程中分治的一层层重心看作是一棵新的树,每个分治重心向它的上次分治重心连边,我们就得到一棵深度严格log的点分树。
考虑通过维护点分树上的信息来解决问题,我们发现每次修改影响的只是点到根的路径。
我们维护三个堆:
A:每个重心存储所有子树中节点到它的距离。
B:每个重心存储每个子树的最大距离,即所有子节点的A的最大值建成堆B
ans:维护答案最大值,即每个堆B的最大值和次大值之和。
这样就可解决这道题了。

BZOJ2959——Data_Structure——LCT/DSU
如果没有加边操作,可以直接tarjan+树剖来做。
现在有加边,实际上我们要维护的就是动态缩点和动态求链值。可以考虑用LCT来维护。
如果加入某条边之前两个端点就联通,我们就将这两个点之间的路径提出来,缩成一个节点,并用一个并查集维护每个点所属的元素代表信息。
然后就是LCT的操作了。注意缩环以后的fa要在DSU上find。

6.14

LGP3936——Others——Simulated_Annealing
模拟退火好题,换了几个种子才过。

6.18

BZOJ3572——Others——Virtual_Tree/DP
虚树入门题,那么虚树是什么呢。
对于一类树上问题,如果询问多但是涉及总点数比较少的话,我们可以去掉那些无关的点。
能够保留的点就是所有有关的点和他们的LCA。

虚树的构建:我们先再次把所有点按dfs序排序,然后我们考虑这样一种方法,我们维护一个栈,如果栈为空,直接加点,否则我们看栈顶的点是不是当前点的祖先,如果不是,那么弹出栈顶继续,否则就可以把当前点加进栈了(然后从栈顶向这个点连一条边)。(因为之前插入的点可能是和当前点是并列关系,这个不一定会需要用到lca,因为我们记录一个dfs时入队和出队的顺序就可以了)。(第一个点就直接作为根了)。

对于这题,构建虚树后我们分别从叶子往根和从根往叶子dp,处理出虚树上距离每个点最近的议事处。
接着枚举虚树上每一条边,考虑它对两端点的答案贡献,如果两端点不属于同一个点,显然会存在中间分界,我们倍增找出分界点后对两边计算贡献即可。
注意还要另开一个g数组记录没有在上面讨论到的节点,这些节点会与他们在虚树上的父亲属于同一节点,我们要删去多算的部分。

LGP4714——Math——Miller_Rabin&Pollard_Rho
分解质因数以后就乘一乘计算贡献:如果第iii个质因子有pi" role="presentation">pipip_i个,一共有nnn个质因子,那么答案就是:

∏j=1n(∏i=1pjpj−k−i−1i)" role="presentation">∏j=1n(∏i=1pjpj−k−i−1i)∏j=1n(∏i=1pjpj−k−i−1i)

\prod_{j=1}^n (\prod_{i=1}^{p_j}\frac {p_j-k-i-1} {i})

大概吧,随便yy一下应该也可以了。

6.20

BZOJ5251——Map——Network_Flow——Max_Flow——Common
对于第一个问题,如果我们并不需要知道每个人匹配到了谁,实际上就是一个二分图匹配。
现在要求知道每个人匹配到谁,我们只需要动态加边跑网络流,即对当前考虑的选手向它的导师连边,看增广了哪条边。
对于第二个问题,二分暴力重构图就可以过了。更优秀的方法是先连上所有这个点可以连的边,然后从第一名开始增广,直到找不到增广。
这样两个的复杂度都是O(n∗n2)O(n∗n2)O(n*n^2),其中n2n2n^2是二分图匹配的复杂度。整道题的复杂度就是O(T∗n3)O(T∗n3)O(T*n^3)

BZOJ4372——Divide_Conquer——Dynamic_Tree_Divide
又一道动态点分治。
我们对点分树上的每个点开一棵线段树,维护子树到这个点距离为x的所有增量。
如果直接这样统计的话显然会算重,一种简单的处理方法是再开一棵线段树维护子树到它父亲距离为x的所有增量。
事实上开的这个线段树是多余的……不过思想就是这样了。
查询修改都是往上算/改到根就行了。
嗯,支持区间修改单点查询的简单线段树。

6.21

BZOJ3648——Divide_Conquer——Point_Divide/Map——Circle_Tree

6.22

BZOJ4018——Math——Mobius
CF623E——Math——FFT
YALI_Walk——Others——Miscellaneous/Math——Miller_Rabin&Pollard_Rho
题解

6.24

OTHER_1——DP——Tree

6.25

CF986E——Others——Virtual_Tree/BIT
每个素数是独立的,一个数最多拆成logloglog个不同的素数,这样分解出的所有素数个数为nlog(maxval)nlog(maxval)nlog(max_val)
考虑对每个素数建立虚树,这样虚树的总点数和素数个数同阶。
对于每颗虚树处理出答案,我们关注的是每个点这个素数的个数,用倍增+BIT维护。
再利用处理出来的虚树贡献答案即可。

6.26

BZOJ5392——Others——Scan_Lines
题解

6.27

BZOJ2286——Others——Virtual_Tree
每次按照关键点的dfs序排序,维护栈构建一棵虚树,在新的树上dp

BZOJ4044——String——PAM
考虑最后一次2操作,那之后的字符都是暴力拼上去的。那么可以枚举每一个回文子串,算出拼出它的最少次数,然后加上总长度减它的长度来更新答案。
那么考虑怎么算出每一个回文子串的最少次数。
对于一个长度为偶数的回文串:可以用反证法证明最后一步一定是2操作。那么分两种情况:2操作前向外添加字符,可由这个串去掉两端+1得到。2操作前向内添加字符,可由最长的小于等于一半长度的回文后缀+(一半长度-该后缀长度)得到。既向内又向外可归类到只向外中。
对于长度为奇数的回文串:去掉两端+2,或最长的小于等于一半长度的回文后缀+(整个长度-该后缀长度)。
如何快速找到小于等于一半长度的最长回文后缀?它在回文树上的父亲已经找过了,在此基础上接着找即可。显然最多只可能有一次长度不符合要求,所以不影响复杂度。

【刷(shui)题记录】201805 ~201806相关推荐

  1. 刷(shui)题记录 2021.12

    [ABC228-G] Digits on Grid ⇒\Rightarrow⇒原题链接 可以发现行数和列数相当小,可以将其中一维状压,同时因为奇数步和偶数步的操作很类似,只需要考虑其中一种就行了,这里 ...

  2. 图论刷水题记录(二)(最短路-----SPFA算法)

    继第一篇的后续,又来刷水题了,写的是SPFA算法,这个算法的复杂度比较玄学,感觉能不用就不用了,但是他的好处就是可以判断负圈. 3月26日: 1.POJ 1847 Tram 题意:在一个交通网络上有N ...

  3. 图论刷水题记录(一)(最短路-----dijkstra算法)

    最近实在不知道干些什么,感觉自己除了水题什么都不会做,算了去刷一刷图论的水题吧本来想合起来一起发,想了想太长的话以后看起来也不方便,题目所以今天晚上就先发了dij部分,由上到下由易变难. 1.POJ ...

  4. LeetCode刷题记录15——21. Merge Two Sorted Lists(easy)

    LeetCode刷题记录15--21. Merge Two Sorted Lists(easy) 目录 LeetCode刷题记录15--21. Merge Two Sorted Lists(easy) ...

  5. LeetCode刷题记录14——257. Binary Tree Paths(easy)

    LeetCode刷题记录14--257. Binary Tree Paths(easy) 目录 前言 题目 语言 思路 源码 后记 前言 数据结构感觉理论简单,实践起来很困难. 题目 给定一个二叉树, ...

  6. LeetCode刷题记录13——705. Design HashSet(easy)

    LeetCode刷题记录13--705. Design HashSet(easy) 目录 LeetCode刷题记录13--705. Design HashSet(easy) 前言 题目 语言 思路 源 ...

  7. LeetCode刷题记录12——232. Implement Queue using Stacks(easy)

    LeetCode刷题记录12--232. Implement Queue using Stacks(easy) 目录 LeetCode刷题记录12--232. Implement Queue usin ...

  8. LeetCode刷题记录11——290. Word Pattern(easy)

    LeetCode刷题记录11--290. Word Pattern(easy) 目录 LeetCode刷题记录11--290. Word Pattern(easy) 题目 语言 思路 源码 后记 题目 ...

  9. LeetCode刷题记录10——434. Number of Segments in a String(easy)

    LeetCode刷题记录10--434. Number of Segments in a String(easy) 目录 LeetCode刷题记录9--434. Number of Segments ...

  10. LeetCode刷题记录9——58. Length of Last Word(easy)

    LeetCode刷题记录9--58. Length of Last Word(easy) 目录 LeetCode刷题记录9--58. Length of Last Word(easy) 题目 语言 思 ...

最新文章

  1. mysql分组后统计
  2. SpringMVC学习(六)——Spring四种方式整合MyBatis
  3. OkHttp源码深度解析
  4. linux shell read line,【Linux shell】while read line
  5. jquery修改a标签的href链接和文字
  6. linux命令和应用程序,在Linux中开发C应用程序时的重要且方便的工具和命令
  7. ./configure:command not found 解决方法
  8. ie11只能用管理员身份打开解决办法
  9. 华为荣耀7i刷linux,华为荣耀7i卡刷教程_荣耀7i用第三方recovery刷机教程
  10. 成本会计的概念、产品成本核算的要求、产品成本核算的对象与成本项目、产品成本的归集和分配(可能考判断)、产品成本计算方法 (三种:产品的品种(品种法),批次(分批法),步骤(分步法))
  11. 微信小说域名被封-366tool在线解答微信屏蔽小说网页停止访问的解决方案
  12. 编码规则的发展历程(通俗版)
  13. 获取当前的时间是第几周
  14. 【软件工程】软工视频总结
  15. 国科大学习资料--人工智能原理与算法-第一次作业解析(学长整理)
  16. 微信公众号裂变引流教程,2020微信公众号引流最新方法集合
  17. 【服务器数据恢复】服务器断电导致RAID报错的数据恢复案例
  18. WPF 3D模型介绍及使用
  19. eclipse中显示代码行数
  20. nginx配置文件解释(转载隔壁老梁)

热门文章

  1. 在 vue3 项目中出现 无法使用 JSX,除非提供了 “--jsx“ 标志 提示的解决办法
  2. 【查验身份证】Python
  3. Postgresql error could not pull up equivalence class using projected target list (pathkeys.c:1330)
  4. centos+7.2+linux版本,在Linux Centos 7.2 上安装指定版本Docker。
  5. 【面试题】类似国际象棋的棋子移动实现
  6. DEDECMS模板原理、模板标签学习
  7. 15 基于STM32智能路灯灯光自动控制系统设计
  8. clickhouse除数为0时报错
  9. Excel图表神器EasyShu2.9,堪称作图神器,主流好看专业有颜值的图表一键出图
  10. python range函数什么意思_python range函数怎么用,_Python_ 少侠科技