
练习记录
算法刷题记录
Flyzz~
这个作者很懒,什么都没留下…
展开
-
练习记录(dfs序)
DFS序的练习来源牛客每日一题选点根据根右左的遍历顺序的到dfs序,再求lis即为可以选到的最多点。Colorful Tree利用dfs序维护每种颜色的树,大佬博客需要注意的是当只能取同一边的两个点时,要取dfs序差值最大的两个点,可以想出反例,但不会证明。#include<bits/stdc++.h>using namespace std;const int maxn =1e5+5;int head[maxn];struct edge{ int to,nxt; e原创 2020-12-09 23:53:35 · 194 阅读 · 0 评论 -
练习记录(高斯消元,kmp,dp)
UVA1358题目实际本题还有更好的dp做法,之后再学习一下。不过正好学了高斯消元,就练习一下。设F[i]F[i]F[i]为已匹配了前i为字符,得到期望字符串还需要补上字符串的长度的期望值。显然,F[m]=0.F[m]=0.F[m]=0.F[i]=∑F[j]/n+1,0=<i<mF[i]=\sum{F[j]}/n+1,0=<i<mF[i]=∑F[j]/n+1,0=<i<m,j是枚举加上的字符后转移到的状态,这个状态值可以由前缀函数推得。根据全期望公式,就可以得到该公原创 2020-12-05 23:49:56 · 155 阅读 · 0 评论 -
练习记录
虚树对于多组询问,且每组询问都包含树上一些不同的点的查询的树上问题可能会用到虚树。虚树的建立学习链接void add(int s){ if(!c) { vtree[++c] = s; return; } int f = query(pre[s],pre[vtree[c]]); while((c>1)&&pre[f]<pre[vtree[c-1]]) { add_edg原创 2020-12-02 12:35:57 · 157 阅读 · 0 评论 -
练习dsu on tree
题目注意点‘:1. 1~1e5每个数最多因子数不超过1002.dsu on tree标准步骤:1.找好重儿子2. dfs先处理轻儿子,在处理重儿子,保留重儿子的数据,在遍历轻儿子及后代得到相关信息。3. 如若当前点为轻儿子删除该点及后代的影响。#include<bits/stdc++.h>using namespace std;const int maxn=1e5+5;struct edge{ int to,next,w; edge(int to=0,int原创 2020-08-25 17:21:56 · 114 阅读 · 0 评论 -
练习纪录(网络流)
uva1658利用了分点法,如果直接跑流量为2最小费用流,有可能出现某个点出现两次,所以把2~v-1分为两个点中间连一条容量为1,费用为0的边,实操时可用2i,2i+1代替i点一个连入的边,一个连出的边。另外紫书上提示这是解决节点容量问题的通法,需要注意。#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=2000+7;const int inf=1e9;struct edge原创 2020-07-06 16:04:10 · 104 阅读 · 0 评论 -
练习记录(网络流入门)
uva11082没有想法,看了紫书的解析。先把矩阵每一个元素-1,这样每个元素取值范围变为0~19,这样就允许了0流量的存在。把所有行的和x1,x2…xr,列的和y1,y2,…yc看为节点源点于所有行和节点相连,容量为x[i]-c;列和节点于汇点相连,容量为y[i]-r;每个x节点在与所有y节点相连,容量为19,跑最大流。则xi于yj边的流量变为 A[i][j]-1.可以这样理解每一行的和可以由不同列的元素构成,只要与源点和汇点相连的边都满载,即说明在满足行和列和一定的条件下有解。#include<原创 2020-07-05 21:05:48 · 208 阅读 · 0 评论 -
练习记录(权值线段树or set)
牛客练习赛的一道题目 先想到一个思路,对于一个固定的左端点,右边第一个比他大的数下标为i,第二个为j,则右端点必然在[i,j-1]之间,同时对于每一个右端点满足要求的左端点也在一个区间中,还需要检查固定的左端点是否在该区间中。直接检查的话会超时,可以检索每个点为右端点,对应的区间中有多少成立的左端点转化为区间和问题,可用树状数组解决。而某个点A作为左端点成立时仅在右端点为[i,j-1]是成立,只需要在枚举到以i为右端点时将A激活(即树状数组add(A,1)),在枚举j时再消除他的影响即可。#includ原创 2020-07-01 20:31:19 · 161 阅读 · 0 评论 -
练习记录uva1354
题目一道暴力搜索题目,第一个要点:枚举天平就相当枚举二叉树。另外要记录不同集合可以摆出的二叉树所有状态(偏左值,偏右值),再往上推。刚开始没做过多少暴力搜索题,以为像回溯法一样找到一棵二叉树统计宽度,在统计下一颗,貌似不太好办。考虑到数据不大,直接记录所有状态即可。#include<iostream>#include<cstdio>#include<algorithm>#include<set>#include<queue>#inc原创 2020-06-14 16:23:19 · 152 阅读 · 0 评论 -
刷题记录(LA4850 贪心)
题目如果是问最大惩罚值的最小值的话,只需要按截止时间从小到大排一下序就可以了。但问的是最大两个惩罚值的最小值。有点没办法,一度以为有什么操作能直接优化两个数的和最小,好像不太行。在网上搜了题解看到一个思路。先按截止时间排序,在尝试把一个任务A调到任务B后这样A+1到B的惩罚值都得到优化而A的惩罚值提高,不过最大两值的和有可能减小。另外每次移动后A的惩罚值直接变得比原本A~B中最大的惩罚值还要大,因为交换后A的理想结束点最靠前,但完成点在区间终点。所以只会移动一次,要不然会造出两个比原来大的值。#incl原创 2020-06-09 20:43:07 · 165 阅读 · 0 评论 -
练习记录la 4254
题目最大值的最小值,显然要二分答案,问题则转化为如何检验答案是否可行。可以发现每一个时刻优先处理结束时间最近的工作是最优的。利用这一点贪心,比较好的做法是从下到大检查时刻,每个时刻做结束时间离得最近的(利用优先队列),如过出现结束时间在检查的时刻之前则不可行。然而我没想到,这是做完后查博客看到的。此题我利用了线段树。由之前的贪心,可以先处理结束时间早的工件,且完成它的时间因尽量偏左(小),感觉比较麻烦,唉,还是要灵活思考问题。#include<iostream>#include<原创 2020-06-05 15:59:21 · 161 阅读 · 0 评论 -
练习记录(单调队列优化dp)
uva上的题目#include<iostream>#include<cstdio>#include<algorithm>#include<set>#include<queue>#include<cstring>#include<string>#include<cmath>#include<vector>#include<stack>#include<map>原创 2020-06-03 11:04:59 · 146 阅读 · 0 评论