题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4539 明明就是把每次复制的一个子树当作一个点,这样能连出一个树的结构,自己竟然都没想到.思维有待加强. 找编号为 k 的点,可以通过给 dfs 序建立对于编号的主席树.可以做一个 s[ i ] 表示第 i 步操作之后一共有多少个点,二分得知编号第 k 大的点在哪一步操作建出的大点里,然后用主席树查一下具体是哪个小点即可.每个大点记录一下自己的根,还有连向父亲中的哪个小点. 处理出每个小点在…
题目大意:给你一个序列,求某个区间出现次数大于一半的数是什么 主席树裸题,刷刷水题提升自信= = #include <cstdio> #include <cstring> #include <algorithm> #define ll long long #define il inline #define N 500100 using namespace std; //re int n,m,tot; int a[N],root[N]; struct Seg{ int l…
先考虑80分做法,即满足A串长度均不小于B串,容易发现每个B串对应的所有A串在后缀数组上都是一段连续区间,线段树优化连边然后判环求最长链即可.场上就写了这个. 100分也没有什么本质区别,没有A串长度不小于B串的性质后,区间连边变成了矩形连边,用主席树或KDTree优化连边即可,当然主席树会更靠谱,这里写了KDTree,在loj上T掉了. #include<bits/stdc++.h> using namespace std; #define ll long long #define N 20…