
笛卡尔树
天翼之城*
这个作者很懒,什么都没留下…
展开
-
2016 ICPC Hong Kong G Scaffolding —— 笛卡尔树上DP
This way题意:他这个题意稍微的不正确,它应该是放了这个竹子之后就到这个竹子上面(也许)。否则样例,题解和程序就不对了吧。题解:大致思路就是这样,我这里用dp代替了f,res代替了g。sum表示子树的值的和,siz表示子树大小。ll v=(a[x]-a[fa])*siz[x]-res[ls[x]]-res[rs[x]];表示当前点把统治的区间内的所有点的高拆到和父亲一样高的时候,还需要拆几个(因为要减去儿子的贡献)res[x]=dp[x]*m-sum[x]+a[fa]*siz[x]原创 2020-08-12 16:47:42 · 606 阅读 · 0 评论 -
POJ 2559 Largest Rectangle in a Histogram —— 笛卡尔树模板
This way题意:现在有n个连着的矩形,每个矩形的宽为1,高为a[i],问你在这些矩形内部最大能组成的矩形大小。题解:笛卡尔树模板,模板和之前有了一些变化,增加了连边的特判,这样子就算有起始点为0的地方也无妨。当然要注意初始化#include<bits/stdc++.h>using namespace std;#define ll long longconst int N=2e5+5;int fa[N],ls[N],rs[N],st[N],top;int n;ll原创 2020-08-12 16:35:53 · 177 阅读 · 0 评论 -
洛谷 P4755 Beautiful Pair —— 主席树+笛卡尔树
This way题意:题解:这道题就比2020牛客三的题目简单很多了,我一眼就看出来他是主席树+笛卡尔树。但是我觉得这道题应该有时间复杂度更低的做法,等有时间了再琢磨琢磨。那么首先以下标为顺序,值越大优先级越高的形式建立笛卡尔树。然后再dfs这棵树。此时的时间复杂度是O(n)O(n)O(n)的,那我就在想,是否可以对于每个区间都快速O(1)O(1)O(1)或者O(log)O(log)O(log)得到。我一下子想不出来然后我就想到了枚举当前区间较短的一边,这样时间复杂度最多是O(log)O(原创 2020-07-24 19:58:40 · 264 阅读 · 0 评论 -
2020牛客暑期多校训练营(第三场) H Sort the Strings Revision —— 笛卡尔树,有丶东西
This way题意:给你一个长度为n的串s0,然后现在有一个长度为n的排列p和一个长度为n的d,从0开始到n-1,每次都有一个操作:si+1=sis_{i+1}=s_isi+1=si,然后替换掉si+1s_{i+1}si+1的第p[i]个字符为d[i]。问你这n+1个字符串的字典序。题解:太强了,根本想不到啊首先以位置为顺序,p的大小为优先级建立笛卡尔树,注意如果d[i]==p[i]%10,就是说如果改了这个点的值根没改一样,那么就将p[i]设为inf,表示它一定是最后的,在这道题,表示原创 2020-07-24 18:34:45 · 346 阅读 · 0 评论 -
2019牛客暑期多校训练营(第四场)C sequence —— 笛卡尔树模板+线段树
This way题意:问你题解:遇到这种题目一定是先做最小的点所覆盖的区间,依次这样递归下去。这时候就有一个快速知道当前最小的点的位置以及区间的做法:笛卡尔树以下的讲解是基于顺序为下标,排序为最小值最优。笛卡尔树就是一个类似二叉搜索树的二叉树,首先用一个单调栈来维护从根开始的最右链,然后每次进来一个位置i,依次pop直到找到第一个小于等于a[i]的位置,将那个点的右儿子标为i,i的左儿子为刚才栈中第一个大于i的位置。void build(){ for(int i=1;i<=原创 2020-07-24 13:14:53 · 260 阅读 · 0 评论