随笔分类 - 数据结构--------------------------
摘要:【题目】F. Imbalance Value of a Tree 【题意】给定n个点的带点权树,求所有路径极差的和。n,ai<=10^6 【算法】并查集 【题解】先计算最大值的和,按点权从小到大排序,每个点x和相邻的已访问点的点集形成的路径的最大值都是a[x],因为已访问过的点点权较小,然后用并查集
阅读全文
摘要:【题目】E. Physical Education Lessons 【题意】10^9范围的区间覆盖,至多3*10^5次区间询问。 【算法】线段树 【题解】每次询问至多增加两段区间,提前括号分段后线段树。 #include<cstdio> #include<cctype> #include<set>
阅读全文
摘要:【题意】给定n台在时间di可以买入的机器,pi买入,可在任意时间ri卖出,买入和卖出之间的持有时间每天产生gi金钱,任意时间至多持有一台机器。给定初始钱数c和总天数T,求最大收益。n<=10^5。 【算法】动态规划+斜率优化(CDQ分治) 【题解】机器按di排序,添加一台时间为T+1的机器,令f[i
阅读全文
摘要:【题目】D. Too Easy Problems 【题意】给定n个问题和总时限T,每个问题给定时间ti和限制ai,当解决的问题数k<=ai时问题有效,求在时限T内选择一些问题解决的最大有效问题数。n<=2*10^5,T<=10^9。 【算法】贪心(排序+堆) 【题解】因为T太大,不能考虑背包。 容易
阅读全文
摘要:【题意】初始资金s,有两种金券A和B,第i天,买入时将投入的资金购买比例为rate[i]的两种股票,卖出时将持有的一定比例的两种股票卖出,第i天股票价格为A[i],B[i],求最大获利。n<=100000。 【算法】动态规划+斜率优化(CDQ分治) 【题解】为了最大获利,每次交易一定是全部买进和全部
阅读全文
摘要:【题意】给定1~n的排列,m次操作每次删除一个数,求每次操作前的逆序对数。n<=10^5,m<=50000。 【算法】CDQ分治+树状数组 【题解】先树状数组求逆序对,然后统计每次删除的逆序对数。 每个数字及其坐标构成一个二维坐标,逆序对就是两个相对位置在左上右下的点,那么删除一个点会减少的逆序对就
阅读全文
摘要:【题意】给定n个数字ai和L,R,ai=0代表在L~R中任取,求最长上升子序列。n<=10^5,0<=ai<=10^5。 【算法】DP+平衡树(fhq-treap) 【题解】对于LIS,有两种经典O(n^2)的递推式,即 ①f[i]表示以 i 结尾的LIS,f[i]=max(f[k]+1),k<i&
阅读全文
摘要:【题目】D. Roads in Yusland 【题意】给定n个点的树,m条从下往上的链,每条链代价ci,求最少代价使得链覆盖所有边。n,m<=3*10^5,ci<=10^9,time=4s。 【算法】树形DP+线段树||可并堆 【题解】从每条边都需要一条链来覆盖的角度出发,令f[i]表示覆盖子树
阅读全文
摘要:【题目】C. Ultimate Weirdness of an Array 【题意】给定长度为n的正整数序列,定义一个序列的价值为max(gcd(ai,aj)),1<=i<j<=n,定义f(i,j)为移除序列i~j后剩余序列的价值,求Σf(i,j)。1<=n,ai<=2*10^5。 【算法】数论+线
阅读全文
摘要:【题意】三维偏序,给定n个点(x,y,z),求每个点和(0,0,0)组成空间中的点数,有重点。1<=x,y,z<=2*10^5,1<=n<=10^5。 【算法】CDQ分治+树状数组 【题解】CDQ算法知识 三维偏序,一维排序扫描线(x),一维树状数组前缀和(y),一维CDQ分治(z作为时间维)。 1
阅读全文
摘要:【题目】F. Letters Removing 【题意】给定只含小写字母、大写字母和数字的字符串,每次给定一个范围要求删除[l,r]内的字符c(l和r具体位置随删除变动),求m次操作后的字符串。n<=2*10^5。 【算法】树状数组+平衡树(set) 【题解】因为坐标是序列变动后的,动态坐标可以转化
阅读全文
摘要:【题目】E. Segments Removal 【题意】给定n个数字,每次操作删除最长的连续相同数字(等长删最左),求全部删完的最少次数。n<=2*10^6,1<=ai<=10^9。 【算法】并查集+堆 【题解】将序列的相同数字段压缩,全部插入堆。那么每次操作删除堆顶,并尝试合并堆顶的前驱和后继,能
阅读全文
摘要:【题意】n*n的矩阵,初始值为0(题面有误),m次操作,增加一个格子的权值,或查询子矩阵和。n<=2*10^6。(m应该较题面所述偏大)。 【算法】CDQ分治(算法知识见数据结构) 【题解】三维偏序,一维排序扫描线(x坐标),一维树状数组前缀和(y坐标),一维CDQ分治(操作时间)。 每个矩阵查询差
阅读全文
摘要:【题目】D. Acyclic Organic Compounds 【题意】给定一棵带点权树,每个点有一个字符,定义一个结点的字符串数为往下延伸能得到的不重复字符串数,求min(点权+字符串数),n<=300000,time=3s。 【算法】trie合并||hash+线段树合并||dsu on tre
阅读全文
摘要:【题意】给定一棵带点权树,三种操作: 1.询问点x到根的路径和 2.子树x内的点权加定值y 3.将点x的父亲更换为y,保证仍是树。 【算法】平衡树(fhq-treap) 【题解】 将树的dfs序作为序列维护,对每个点入栈+1,出栈-1,这样操作1就是前缀和(非此路径的都会正负抵消),操作2就是区间加
阅读全文
摘要:【题意】给定ai,将1~n从小到大插入到第ai个数字之后,求每次插入后的LIS长度。 【算法】树状数组||平衡树 【题解】 这是树状数组的一个用法:O(n log n)寻找前缀和为k的最小位置。(当数列中只有0和1时,转化为求对应排名的数字,就是简单代替平衡树) 根据树状数组的二进制分组规律,从大到
阅读全文
摘要:【旋转】 平衡树中的旋转是指在不改变中序遍历的前提下改变树的形态的方式。(中序遍历=排名顺序) 右旋将当前点的左节点旋上来,左旋反之。(图侵删) 原根k,新根o。 1.把k的左节点o解放出来并更新为o的右节点。 2.解放出来的o成为新根,其右孩子赋为k。 【Treap】树堆 功能:维护支持单点插入和
阅读全文
摘要:【题意】给定含有n个0的的数列。 1.区间加值 2.区间翻转 3.区间求最大值 【算法】平衡树(fhq-treap) 需要特别注意的是: 1.使0点对全局无影响并全程保持(例如求max,t[0].mx=-inf) 2.平衡树和线段树的上传区别在于要考虑本身这个点。 #include<cstdio>
阅读全文
摘要:【题意】 1. 插入x数 2. 删除x数(若有多个相同的数,因只删除一个) 3. 查询x数的排名(若有多个相同的数,因输出最小的排名) 4. 查询排名为x的数 5. 求x的前驱(前驱定义为小于x,且最大的数) 6. 求x的后继(后继定义为大于x,且最小的数) 【算法】平衡树(treap) 重要的细节
阅读全文
摘要:【题意】给定三个长度为n的排列,求在三个排列中顺序相同的数对个数。 【算法】逆序对 【题解】很容易联想到NOIP火柴排队,涉及顺序问题显然和逆序对息息相关。 一个数对如果在三个排列中顺序不同,一定是1+2或2+1,也就是只在两数列之间顺序相同。 所以对三个数列两两求逆序对总数num,则不满足要求的数
阅读全文