题目:
题意:
已知哈希函数为 hash(x) = x mod n ,如果出现哈希冲突,则 hash(x) = hash(x+1),直到没有冲突为止,现给出一张 hash 表,输出字典序最小的插入顺序
分析:
如果x不在hash(x)的位置上,那么hash[x]到x所在位置所有的数一定比x先插入,容易想到建图跑拓扑排序即可,但直接建图复杂度N^2,因为是一段区间上的点到点的建边,考虑将这段区间映射到线段树上的一个点,将线段树上每个节点与其父亲连一条单向边(两个儿子过了才能到父亲),建边时找到对应节点建边即可,注意:可能区间不合法,也就是区间没填满,用前缀和判断,最小字典序优先叶子节点的值就好了
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e6+255;
int tr[maxn<<2],a[maxn],sum[maxn],T,n;
struct edge{
int to,nxt;
}e[maxn<<2];
int head[maxn<<2],cnt,pos[maxn<<2],val[maxn<<2],in[maxn<<2],vis[maxn<<2],num;
inline void ad