随笔分类 - 数据结构--------------------------
摘要:【题意】两列n个火柴,分别有高度ai和bi(同一列高度互不相同),每次可以交换一列中的两个相邻火柴,定义距离为∑(ai-bi)^2,求使距离最小的最少交换次数,n<=10^5。 【算法】逆序对 【题解】∑(ai-bi)^2=∑ai^2+∑bi^2-∑ai*bi,其中∑ai^2和∑bi^2为常数,则要
阅读全文
摘要:【题意】给定n个点的树,从无到有加边,过程中动态询问当前图某条边两端连通点数的乘积,n<=10^5。 【算法】线段树合并+并查集 (||LCT(LCT维护子树信息 LCT维护子树信息(+启发式合并))——嗷嗷待补) 【题解】先将所有边离线加入计算dfs序(套路,强制固定原树形态) 对于一条边(u,v
阅读全文
摘要:【题意】公车从1开到n,有k群牛想从一个点到达另一个点,公车最多乘坐c个人,牛群可以拆散,问最多载多少牛到达目的地。 【算法】贪心+堆 【题解】线段和点的贪心,一般有按左端点排序和按右端点排序两种方法。 按左端点排序,到达了终点就下车,人数满了就贪心地删掉当前终点最远的牛。 正确性在于,在对左一致的
阅读全文
摘要:【题意】给定n个点的树,m次求[a,b]和[c,d]中各选出一个点的最大距离。abcd是标号区间,n,m<=10^5 【算法】LCA+树的直径理论+线段树 【题解】 树的直径性质:距离树上任意点最远的点一定是直径的一端。此结论在点集中依然试用。 那么根据性质,容易得到答案路径的两端一定是[a,b]直
阅读全文
摘要:【题意】给定n个元素,m次给一段区间染色为i,求最终颜色。 【算法】并查集 【题解】因为一个点只受最后一次染色影响,所以倒过来每次将染色区间用并查集合并,父亲指向最右边的点。 细节: 1.fa[n+1]=n+1!!!界外点要赋值为自身!!! 2.swap(l,r),涉及双端点的题都要注意。 #inc
阅读全文
摘要:【题目】洛谷10月月赛R1 提高组 【算法】递推DP+树状数组 【题解】列出DP递推方程,然后用树状数组维护前后缀和。 #include<cstdio> #include<cstring> #include<cctype> #include<cmath> #include<algorithm> #d
阅读全文
摘要:【题意】已知n天股价,每天可以买入一股或卖出一股或不作为,最后必须持0股,求最大收益。 【算法】堆 贪心? 【题解】 不作为思想:【不作为=买入再卖出】 根据不作为思想,可以推出中转站思想。 中转站思想:【买卖可以借助中转站,差值累加】 做法:从左到右,每次将两个-v加入堆,然后取大堆顶出来组成买卖
阅读全文
摘要:【题意】给定n头牛,k个特色,给出每头牛拥有哪些特色的二进制对应数字,[i,j]平衡当且仅当第i~j头牛的所有特色数量都相等,求最长区间长度。 【算法】平衡树+数学转化 【题解】统计前缀和sum[i][j]表示前i头牛特色为j的数量,则区间i~j平衡需要满足: sum[j][1]-sum[i-1][
阅读全文
摘要:【算法】线段树||树状数组&&并查集 【题解】修改必须暴力单点修改,然后利用标记区间查询。 优化:一个数经过不断开方很快就会变成1,所以维护区间最大值。 修改时访问到的子树最大值<=1时,该区间就不必修改。 #include<cstdio> #include<cmath> #include<algo
阅读全文
摘要:【算法】贪心扫描线(+堆) 【题意】给定n头牛有区间[a,b],m个防晒霜值为ai,每个可以使用bi次,每次可以使包含它的区间涂到防晒霜,问最多被涂牛数。 【题解】 参考:[bzoj1707]: [Usaco2007 Nov]tanning分配防晒霜 by czllgzmzl 本题同样是区间和点的贪
阅读全文
摘要:【算法】贪心+线段树 【题意】给定n个数字ci,m个区间[a,b](1<=a,b<=10^5),每个位置最多被ci个区间覆盖,求最多选择多少区间。 附加退化问题:全部ci=1,即求最多的不相交的区间。 【题解】本题是区间和点之间的经典贪心,有两种经典做法,本质思想都是通过排序实现扫描线,细节根据题目
阅读全文
摘要:【算法】并查集+平衡树+数学+扫描线 【题解】 经典曼哈顿距离转切比雪夫距离。 曼哈顿距离:S=|x1-x2|+|y1-y2|<=c 即:max(x1-x2+y1-y2,x1-x2-y1+y2,-x1+x2+y1-y2,-x1+x2-y1+y2) 令X1=x1+y1,Y1=x1-y1,则转化为 切比
阅读全文
摘要:【算法】线段树(经典线段树上二分) 【题意】n个房间,m个询问,每次订最前的连续x个的空房间,或退订从x开始y个房间,求每次订的最左房间号。 【题解】关键在于找连续x个空房间,经典二分。 线段树标记sum,lsum,rsum,表示最长连续房间,从左开始最长连续房间,从右开始最长连续房间。 对于区间k
阅读全文
摘要:【算法】数学+线段树/树状数组 【题解】 首先三个操作可以理解为更相减损术或者辗转相除法(待证明),所以就是求区间gcd。 这题的问题在线段树维护gcd只能支持修改成一个数,不支持加一个数。 套路:gcd(a,b,c,d,e)=gcd(a-b,b-c,c-d,d-e,e),也就是所有数的gcd可以转
阅读全文
摘要:【算法】扫描线+平衡树(set) 【题解】很明显的二维偏序数点,排序后扫描线,现加点后查询答案。 则问题转化为一维偏序,显然贪心找第一个比当前大的最优,所以用平衡树维护。 记得开multiset!!! #include<cstdio> #include<algorithm> #include<cst
阅读全文
摘要:【题意】n个数字分成k段,每一段的价值是段内不同数字的个数,求最大价值。n<=35000,k<=50。 【算法】分治决策单调+主席树(可持久化线段树) 【题解】 f[i][j]表示前i天分成j段的最大价值。 f[i][j]=max(f[k][j-1]+work(k+1,i)),j-1<=k<i。 首
阅读全文
摘要:【算法】可持久化线段树(主席树)+启发式合并+LCA 【题意】给定森林,每次询问u,v路径上的第k小,或给u,v连边(保证森林),n<=8*10^4。 【题解】 区间第k小:离散化,在上一个位置的基础上建可持久化权值线段树,每次比较左子树和k并找到第一个大于等于k的位置。 树上第k小:每个点上其父亲
阅读全文
摘要:【算法】主席树||离线+树状数组 【题解】 主席树经典应用:找区间不同的数字个数。 做法:记录每个数上一次出现的位置last[i],对last建权值线段树,对于区间询问last[i]<L的数字个数。 注意权值范围是last[i],也即0~n。 注意x=0时返回,否则可能c<0就完了。 #includ
阅读全文
摘要:【算法】DFS序+树状数组 【题解】题意相当于统计前i-1个点在第i个点的祖先的个数,显然可以用dfs维护,用树状数组差分维护前缀和。 出栈不新加节点就要注意左闭右开,即in[a[i]]处+1,ou[a[i]]+1处-1。 出栈新加节点就要注意数组开双倍。 #include<cstdio> #inc
阅读全文
摘要:【算法】最短路树+(树链剖分+线段树)||最短路树+并查集 【题解】 两种方法的思想是一样的,首先题目限制了最短路树唯一。 那么建出最短路树后,就是询问对于每个点断掉父边后重新找路径的最小值,其它路径只能是这个点和其子树节点通过非树边到达非子树节点。 这样考虑很难统计,换个角度考虑每条非树边的影响。
阅读全文