L - A Heap of Heaps CodeForces - 538F 这个是一个还比较裸的静态主席树. 这个题目的意思是把这个数组变成k叉树,然后问构成的树的子树小于等于它的父节点的对数有多少. 因为这个k是从1~n-1 所以直接暴力肯定是不对的,所以可以用主席树来查询区间第k大. 查询的次数大约为n+n/2+n/3+...n/n 差不多是n*log(n) 的复杂度,建个主席树,直接查询即可 #include <cstdio> #include <cstdlib> #incl…
题意: 一个数列多组询问,每次询问[l,r]中最多能选多少个数字,其中每个数字的出现次数不超过k次 题解: 我们保存对于每个位置上,出现超过k次的位置,那么对于每次询问,我们就变成了查询区间[l,r]大于r的数字个数 可以离线,但是本题强制在线,因此使用主席树 #include <bits/stdc++.h> #define endl '\n' #define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0) #define rep(i…
题意: 求树上最长上升路径 解析: 树状数组版: 998ms edge[u][w] 代表以u为一条路的终点的小于w的最长路径的路的条数 · 那么edge[v][w] = max(edge[u][w-1]) + 1; 因为w最小是0  所以所有的w都+1 #include <bits/stdc++.h> using namespace std; , INF = 0x7fffffff; int n, m, maxx = -INF; map<int, int> edge[maxn]; i…
带修改的题主席树不记录前缀,只记录单点,用BIT统计前缀.  对于BIT上每一个点建一棵主席树,修改和询问的时候用BIT跑,在主席树上做就行了.  3k4人AC的题#256...应该不算慢 #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #include<algorithm> #define ll long long using namespace s…
题意: 给出一个n个数的序列,求有几对(i,j)满足a[i]>=j&&a[j]>=i,(i,j)和(j,i)只能算一对. 考虑第i个数会有几个j(j<i)满足条件,首先a[i]>=j就是查询的区间就是[1,a[i]],a[j]>i也就是查询区间[1,a[i]]中有几个a[j]>=i. 岂不主席树?注意去重就行了. //by zykykyk #include<cstdio> #include<ctime> #include<i…
Once, Leha found in the left pocket an array consisting of n integers, and in the right pocket q queries of the form l r k. If there are queries, then they must be answered. Answer for the query is minimal x such that x occurs in the interval l r str…
大意: 给定序列, 将序列划分为若干段, 使得每段不同数字不超过k, 分别求出k=1...n时的答案. 考虑贪心, 对于某个k 从1开始, 每次查询最后一个颜色数<=k的点作为一个划分, 直到全部划分完毕 由于每个划分大小至少为k, 故最多需要查询$\frac{n}{k}$次, 所以总共需要查询$O(nlogn)$次. 查询操作考虑用主席树实现. 对序列中每个点维护一棵线段树, 对于位置$x$的线段树, $[x,n]$的每个位置存它到点$x$的种类数, 非叶结点存儿子的最小值用来二分. 从大到小…
主席树的另一种用途,,(还有一种是求区间第k大,区间<=k的个数) 事实上:每个版本的主席树维护了每个值最后出现的位置 这种主席树不是以权值线段树为基础,而是以普通的线段树为下标的 /* 无修改,求区间[l,r]有多少个不同的数 主席树的另外一种姿势: 不像求区间第k大,区间<=k的数有几个之类的可持久化权值线段树,每个结点维护的是当前版本x的出现次数 本题的主席树每个结点维护当前版本下位置i的值的出现情况 更新:以数组a为基础建立线段树,然后从左往右扫描a 当扫到ai时,如果ai是第一次出现…
3514: Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 1312  Solved: 501[Submit][Status][Discuss] Description N个点M条边的无向图,询问保留图中编号在[l,r]的边的时候图中的联通块个数. Input 第一行四个整数N.M.K.type,代表点数.边数.询问数以及询问是否加密.接下来M行,代表图中的每条边.接下来K行,每行两个整数L…
DQUERY - D-query Given a sequence of n numbers a1, a2, ..., an and a number of d-queries. A d-query is a pair (i, j) (1 ≤ i ≤ j ≤ n). For each d-query (i, j), you have to return the number of distinct elements in the subsequence ai, ai+1, ..., aj. In…
[题意]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. 首先打表发现有决策单调性(把j提到第一维). 然后有经典写法:主席树维护区间不同数字个数. 那么根据决策单调性进行分治,在每次l,r(mid=l+r>>1)从L,R中转移时,用…
题面: https://loj.ac/problem/2720 考虑枚举T串的每个后缀i,我们要做两件事. 一.统计有多少子串[i,j]在S中要求位置出现. 二.去重. 第二步好做,相当于在后缀数组上找到后继,假设后继的height为p. 那对于i这个后缀,只计算i+p后面的即可. 一的话每次找到最远的能匹配的一个位置,可以发现枚举每个后缀时右端点单调,双指针扫一下. 剩下的就是快速的判定一个子串是否合法. 考虑在后缀数组上左右二分到一个区间满足所有后缀和i的lcp都大于等于len(len=j-…
Description:N个点M条边的无向图,询问保留图中编号在[l,r]的边的时候图中的联通块个数. 传送门. lct这么神仙的东西一个题解都不写怎么行??? 神仙思路啊. 其实不是很难但是的确不容易想到. 我们考虑答案是什么. 首先刚开始有n个点分别是联通块,然后你连了一些边使联通块减少了. 怎么减少的呢?就是区间的边的生成树上边的数量.因为如果不是生成树上的边,那么一定与生成树上的边成环了而不会合并联通块. 怎么判断边是不是区间内生成树上的边呢?判断依据就是它有没有和前面的边成环. 那么我…
题意 给出nnn个点,mmm条边.多次询问,求编号在[l,r][l,r][l,r]内的边形成的联通块的数量,强制在线. 分析 LCTLCTLCT维护动态最大生成树,先将每条边依次加进去,若形成环就断掉最早加进去(编号最小)的边,然后记录early[]early[]early[]数组,表示第i条边弹掉了哪条边,若没有弹出边,early[i]=0early[i]=0early[i]=0 然后每个询问的答案就是用n减掉[l,r]区间内early值小于l的边的数量,可以用主席树来维护 正确性证明:因为是…
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4771 题解 一道不错的树链并的基础练习题. 如果不是树,而是一个数组的话,对于给定区间内的不同颜色数,我们可以维护一个 \(pre_{i, j}\) 表示前 \(i\) 个最后一个 \(j\) 出现的位置.那么答案就是 \(pre_{r, j} \geq l\) 的 \(j\) 的个数,用主席树维护,第一维 \(i\),第二维 \(pre_i, j\),维护的是数量就可以了.(当然这个问题还…
正解:主席树 解题报告: 传送门! 挺有趣的,至少我不会$QAQ$(虽然我不会的多了去了$QAQ$ 如果没有这个所谓美味度限制可以直接线段树水过去嘛$QwQ$ 然后现在问的是个异或运算后的结果,关于异或运算,然后还询问最大值,显然就很容易联想到,最大异或和 考虑把每个数做成二进制的形式,然后处理到第$i$位了,设做到第$i+1$位的时候确定的$maxans=as$,然后强制要求这一位是0(是1差不多的思考,一样儿的都$QwQ$),那就相当于是要求是否存在$[ans-x_{i},ans-x_{i}…
题目描述 有一个长度为n的数组{a1,a2,…,an}.m次询问,每次询问一个区间内最小没有出现过的自然数. 输入格式 第一行n,m. 第二行为n个数. 从第三行开始,每行一个询问l,r. 输出格式 一行一个数,表示每个询问的答案. 一开始以为像答案这样的做法会超时,没想到真是这样写... #include<cstdio> #include<algorithm> #include<math.h> #include<string.h> using namesp…
题意 给定一个长度为n的数组A,将它变为一颗k叉树(1 <= k <= n - 1)(堆的形式编号). 问对于每一个k,有多少个节点小于它的父节点. 解题 显然,最初的想法是暴力.因为树的层数到后来好像挺小的.但是仔细看复杂度,好像稳稳的O(n^2). 那就尴尬了.考虑用数据结构优化. 看其他dalao切此题,用的都是主席树.函数式线段树之类的,但juruo我都没学过怎么办qwq 于是只能好生考虑一番. 我们发现:1.一个节点的儿子在原序列中一定是连续的:2.能对某个节点造成贡献的儿子节点的值…
\(>Codeforces \space 538 F. A Heap of Heaps<\) 题目大意 :给出 \(n\) 个点,编号为 \(1 - n\) ,每个点有点权,将这些点构建成 \(k\) 叉树的形式 \((k \in [1, n - 1])\) . 对于编号为 \(i\) 的点,它的儿子区间是 \([\ k(i-1)+2, \ \min(ki + 1, n)\ ]\) 如果说一个点违反堆性质,当且仅当它的点权小于它父亲的点权,对于所有 \((k \in [1, n - 1])\)…
F. A Heap of Heaps time limit per test 3 seconds memory limit per test 512 megabytes input standard input output standard output Andrew skipped lessons on the subject 'Algorithms and Data Structures' for the entire term. When he came to the final tes…
题面 题意:给你一个数组a[n],对于数组每次建立一个完全k叉树,对于每个节点,如果父节点的值比这个节点的值大,那么就是一个违规点,统计出1~n-1完全叉树下的违规点的各自的个数. 分析 注意到完全k叉树的一个性质,v节点的儿子是k*(v-1)+2...kv+1,v节点的父亲为(v+k-2)/k 那我们可以暴力枚举k,然后枚举每个点i,但是我们没必要枚举叶子节点,也就是说i的范围是0到最后一个叶子节点n的父亲,即[0,(v+n-2)/k] 然后对于每个点i,在对应的子节点区间里查询值在[0,a[…
E. The Classic Problem http://codeforces.com/problemset/problem/464/E 题意:给你一张无向带权图,求S-T的最短路,并输出路径.边权为2^xi.xi≤105,n≤105,m≤105. 想法:边权太大了,可以用数组按二进制存下来.带高精度跑太费事了. 观察一下,这里距离的更新:c=(a,b),用dis[a]更新dis[b] ①dis[b][c]=0,直接赋为1.只有一个数字改变. ②dis[b][c]=1,需要进位.考虑极端情况数…
[codeforces538F]A Heap of Heaps 试题描述 Andrew skipped lessons on the subject 'Algorithms and Data Structures' for the entire term. When he came to the final test, the teacher decided to give him a difficult task as a punishment. The teacher gave Andrew…
在今天三黑(恶意评分刷上去的那种)两紫的智推中,突然出现了P3834 [模板]可持久化线段树 1(主席树)就突然有了不详的预感2333 果然...然后我gg了!被大佬虐了! hdu 2665 Kth number 题意就不写了,太经典了(可我还是不会这题,我太菜了) 大佬的题解写的太神仙了,我这么菜的人都看懂了2333,所以我就不写了... 不过这题是真的坑啊...老师在上面讲的时候,我们开始提交(他们交主席树,我交整体二分)然后等讲完我们还没过23333 MLE.TLE.WA(可能还有CE)轮…
链接:http://codeforces.com/contest/484/problem/E 题意: 给你n个数的,每个数代表高度: 再给出m个询问,每次询问[l,r]区间内连续w个数的最大的最小值: 思路: 因为查询的到的值一定是输入的其中一个,那么我们可以二分答案,判断二分得到的答案是否符合,那么在这里我们就只需要找到某个数x,查询区间[l,r]有多少个连续的数大于x,这个操作只需要将高度从小到达排序,倒着插入主席树中,值设为1,那么只要维护有多少个连续的1(线段树区间合并的方法),就代表有…
https://codeforces.com/contest/1080/problem/F 题意 有k个区间,区间的种类有n种,有m个询问(n,m<=1e5,k<=3e5),每次询问a,b,x,y,代表对于种类编号为[a,b]的每一种区间,是否都存在一个区间x<=l,r<=y,输出yes or no 思路 现将区间按左端点从小到大排序,对于每一个询问首先找出第一个左端点大于x的区间,然后看[a,b]中最大的右端点是否>y即可 需要一颗以种类编号为下标,右端点为权值的主席树,维…
题目链接 当时没用markdown写,可能看起来比较难受...可以复制到别的地方看比如DevC++. \(Description\) 给定一个长为n的序列,多次询问[l,r]中最大的只出现一次的数.强制在线. \(Solution\) 我也不知道该怎么说,反正就是预处理 建主席树,套堆/set,树i存l为i,r为[i,n]的答案(这样就是在某棵树上单点查maxv了). 处理好最初的树,就可以利用主席树根据前缀建树的性质,每个点i的建树只需要处理i位置. 那么最初的树就是将所有的数在区间[第一次出…
http://codeforces.com/contest/787/problem/E 题目大意:给你n块,每个块都有一个颜色,定义一个k,表示在区间[l,r]中最多有k中不同的颜色.另k=1,2,3...n,问在每一种情况下,输出能划分出的最小的段落数. 例如: 51 3 4 3 3 ans = 4, 2, 1, 1, 1 [1], [3], [4], [3, 3] [1], [3, 4, 3, 3] [1, 3, 4, 3, 3] [1, 3, 4, 3, 3] [1, 3, 4, 3, 3…
http://codeforces.com/contest/813/problem/E 题目大意: 给出长度为n的数组和k,  大小是1e5级别. 要求在线询问区间[l, r]权值,  权值定义为对于所有不同元素x在区间出现的次数和, 如果x出现次数>k, 那么按k算. 重要转换: 考虑一个区间[L, R]的某个数A[i], 它对答案有贡献 当且仅当 它前面与他权值相同的数中第k个数的位置(记为B[i]) < L 预处理B[], 每次询问就转化为 区间[L, R]中有多少个B[i] <…
题目链接: http://codeforces.com/gym/101161/attachments 题意: 给出节点数为$n$的树 有$q$次询问,输出$a$节点到$b$节点路程中,经过的边的中位数 数据范围: $1\leq n \leq 100000$ $1\leq q \leq 100000$ 分析: 建一颗主席树,不同的是,节点的根继承的是父节点的根 再用$lca$求出公共祖先$tree[a]+tree[b]-2*tree[lca(a,b)]$ ac代码: #include<bits/s…