题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=5361 好神的一道题啊! 容易看出来是要用维护权值的数据结构,因此树链剖分首先pass掉. 那么不妨用树上主席树试试?每个版本存当前点到根路径上的点的权值. 如果维护区间权值数量的话,你发现没有明确的判断条件来明确每一次主席树上二分是走左子树还是右子树. 这时就要用到一个套路了:将1~200000的所有权值随机映射成unsigned long long的数,主席树维护区间权值异或和. 再…
bzoj Description 给你一棵树,每个点有一个编号\(a_i\).\(Q\)组询问,每次问一条路径上最小的出现了偶数次的编号是多少(包括零次). 多组数据,\(T\le10,n,Q,a_i\le200000\) sol 这又是一道随机化神题. 给每个编号随机一个\(unsigned\ long\ long\)范围内的权值\(val_i\). 对于一次询问,统计路径上所有编号\(\in [l,mid]\)的点的权值的异或和.如果这个异或和不等于\(val_l\otimes val_{l…
随机化选讲例题 题目大意 小 Q 认为,偶数具有对称美,而奇数则没有.给定一棵 n 个点的树,任意两点之间有且仅有一条直接或间接路径.这些点编号依次为 1 到 n,其中编号为 i 的点上有一个正整数 ai. 定义集合 S(u, v) 为 u 点到 v 点的唯一最短路径上经过的所有点 x(包括 u 和 v) 对应的正整数 ax 的集合.小 Q 将在 m 个 S(u, v) 中寻找最小的对称数.因为偶数具有对称美,所以对称数是指那些出 现了偶数次 (包括 0 次) 的正整数. 请写一个程序,帮助小…
挺不错的一道数据结构题QWQ. 一开始发现这个题如果不看数据范围的话,妥妥的树上莫队啊23333,然鹅10组数据是不可能让你舒舒服服的树上莫队卡过的23333 于是想了想,这个题的模型就是,把u到v链上的权值出现奇偶次的01串搞出来,然后第一个0的位置就是所求..... 但是这个01串并不是很好搞,因为每一位都得异或啊....这样复杂度就要乘上一个 200000/32了(bitset压位),还不如树上莫队呢QWQ 不过有一种套路,叫做hash异或,我们就给每一个权值随机一个unsined lon…
分析: 这个题,还是蛮有趣的.考虑,如果l,r区间内的所有数出现奇数次,那么[l-1,r]的抑或和等于所得抑或和. 之后怎么维护呢,主席树维护区间抑或和,记得将每个点附上一个ull级别的随机数,之后抑或的结果冲突的概率就几乎没有了. lca什么的,随便求. 剩下的,考虑二分答案,如果左区间的全为奇数个,就往右走,反之往左走. 附上代码: #include <cstdio> #include <cmath> #include <algorithm> #include &l…
按时间作为主席树的版本,每个版本的主席树都是一个权值线段树. 差分消去时间影响 对于当前时间版本的主席树查询前K大即可. 树上二分时结束后切记判定l==r的状态(易错 l==r叶子节点可能存在多个值(值大小为sum/siz ) 用I64dOLE了好久 .. .... . .. . . . . . . . .. . 用bit/stdc++.h  CE..... #include<cmath> #include<cstdio> #include<cstring> #incl…
[BZOJ5361]/[HDU6291]对称数 题目大意: 一个\(n(n\le2\times10^5)\)个结点的树,每个结点有一个权值\(a_i(a_i\le2\times10^5)\),\(m(m\le2\times10^5)\)次询问,每次询问\((u,v)\)路径上最小的出现偶数次的数. 思路: 对每个权值随机一个unsigned long long作为一个新的权值,树上主席树维护区间异或和. 询问时在主席树上二分即可. 源代码: #include<cstdio> #include&…
BZOJ 1926: [Sdoi2010]粟粟的书架(主席树,二分答案) 题意 : 给你一个长为\(R\)宽为\(C\)的矩阵,第\(i\)行\(j\)列的数为\(P_{i,j}\). 有\(m\)次询问,每次有5个参数\(x_l,x_r,y_l,y_r,h\). 求以\((x_l,y_l)\)为左上角和\((x_r,y_r)\)为右下角的矩形中,至少要选几个值,使得它们的和\(\geq h\). 数据范围 : 对于\(50 \%\)的数据,满足\(R,C \le 200,M \le 200,0…
题目:https://loj.ac/problem/2551 答案是排序后依次走到 K ~ K+r-l . 想维护一个区间排序后的结果,使得可以在上面二分.求和:二分可以知道贡献是正还是负. 于是想用树套树维护一段区间的元素减去从0开始的等差数列的值.为了二分,维护 fr , sc 表示权值区间里第一个/最后一个权值. 时间空间都是 nlog2n 的,空间连 70 分的范围都开不下.而且对拍1000以内的数据还有错误,交上去 TLE 得只能得 70 分. #include<cstdio> #i…
传送门 我们先把果汁按照美味度排序,枚举\(d\),那么肯定是贪心的选择美味程度不小于\(d\)的且最便宜的果汁 发现\(d\)可以二分,那么在主席树上二分就可以了 据说还有整体二分的大佬然而我并不会 //minamoto #include<bits/stdc++.h> #define R register #define ll long long #define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i) #define fd(i,a,b) for(R…