题意:

  给出一个已知的哈希表。求字典序最小的插入序列,哈希表不合法则输出-1。

题解:

  对于哈希表的每一个不为-1的数,假如他的位置是t,令s = a[t]%n。则这个数可以被插入当且仅当第s ~ t-1个数都不为-1且已经插入完成。

  那么对于每一个这样的数,需要连t-s条边(s<=t)或者t+n-s条边(s>t)。

  总的边数有O(n^2)条。可以用线段树优化建图。最后跑一边拓扑排序。

  对于不合法的情况,第s ~ t-1个数存在-1或者拓扑图存在环会导致不合法。

#include <bits/stdc++.h>
using namespace std;
#define P pair<int, int>
const int N = 4e5+;
int t, n;
int cnt, tot;
int ans[N];
int a[N], pre[N];
int pos[N], rt[N<<], deg[N<<];
int head[N<<], nxt[N<<], to[N<<];
priority_queue<P, vector<P>, greater<P> > q;
void add_edge(int u, int v) {
to[++tot] = v;
nxt[tot] = head[u];
head[u] = tot;
deg[v]++;
}
void build(int id, int l, int r) {
rt[id] = -;
if(l == r) {
pos[l] = id;
rt[id] = l;
return;
}
int mid = l+r>>;
build(id<<, l, mid);
build(id<<|, mid+, r);
add_edge(id<<, id);
add_edge(id<<|, id);
}
void update(int id, int l, int r, int ql, int qr, int v) {
if(ql <= l && r <= qr) {
add_edge(id, v);
return ;
}
int mid = l+r>>;
if(ql <= mid) update(id<<, l, mid, ql, qr, v);
if(qr > mid) update(id<<|, mid+, r, ql, qr, v);
}
int main() {
scanf("%d", &t);
while(t--) {
tot = ;
scanf("%d", &n);
memset(head, -, sizeof(int)*(n<<));
memset(deg, , sizeof(int)*(n<<));
for(int i = ; i < n; i++) {
scanf("%d", &a[i]);
pre[i] = a[i] == -;
if(i) pre[i] += pre[i-];
}
int flag = ;
for(int i = ; i < n; i++) {
if(~a[i]) {
int s = a[i]%n, t = i;
if(s <= t && pre[t]-(s==?:pre[s-]) || s > t && pre[t]+pre[n-]-pre[s-]) {
flag = ;
break;
}
}
}
if(flag) {
puts("-1");
continue;
}
build(, , n-);
for(int i = ; i < n; i++) {
if(~a[i]) {
int s = a[i]%n, t = i;
if(s < t) update(, , n-, s, t-, pos[t]);
if(s > t) {
if(t > ) update(, , n-, , t-, pos[t]);
update(, , n-, s, n-, pos[t]);
}
}
}
P now;
cnt = ;
while(!q.empty()) q.pop();
for(int i = ; i < n; i++) {
if((~a[i]) && deg[pos[i]] == ) q.push(make_pair(a[i], pos[i]));
}
while(!q.empty()) {
now = q.top();
q.pop();
int u = now.second;
if(~rt[u]) ans[++cnt] = now.first;
for(int i = head[u]; ~i; i = nxt[i]) {
if(--deg[to[i]] == ) {
if((~rt[to[i]]) && (~a[rt[to[i]]])) q.push(make_pair(a[rt[to[i]]], to[i]));
else if(rt[to[i]] == -) q.push(make_pair(, to[i]));
}
}
}
if(cnt != n-pre[n-]) {
puts("-1");
continue;
}
for(int i = ; i <= cnt; i++) {
printf("%d", ans[i]);
if(i != cnt) printf(" ");
}
puts("");
}
}

2018牛客多校第四场 J.Hash Function的更多相关文章

  1. 牛客多校第四场 J.Hash Function(线段树优化建图+拓扑排序)

    题目传送门:https://www.nowcoder.com/acm/contest/142/J 题意:给一个hash table,求出字典序最小的插入序列,或者判断不合法. 分析: eg.对于序列{ ...

  2. 2019牛客多校第四场J free——分层图&&最短路

    题意 一张无向图,每条边有权值,可以选择不超过 $k$ 条路使其权值变成0,求 $S$ 到 $T$ 的最短路.(同洛谷 P4568) 分析 首先,分层图最短路可以有效解决这种带有 「阶段性」的最短路, ...

  3. 牛客多校第四场 J Free 最短路

    题意: 求最短路,但是你有k次机会可以把路径中某条边的长度变为0. 题解: 跑k+1次迪杰斯特拉,设想有k+1组dis数组和优先队列,第k组就意味着删去k条边的情况,每次松弛操作,松弛的两点i,j和距 ...

  4. 2019牛客多校第四场J free 最短路

    free 题意 给出一个带权联通无向图,你需要从s走到t,你可以选择k条变让他们的权值为0问从s到t的最小权值是多少? 分析 思考一下,如果不带k条白嫖这个条件,那么这就是一个简单的dji就搞定了,我 ...

  5. 牛客多校第四场sequence C (线段树+单调栈)

    牛客多校第四场sequence C (线段树+单调栈) 传送门:https://ac.nowcoder.com/acm/contest/884/C 题意: 求一个$\max {1 \leq l \le ...

  6. 牛客多校第3场 J 思维+树状数组+二分

    牛客多校第3场 J 思维+树状数组+二分 传送门:https://ac.nowcoder.com/acm/contest/883/J 题意: 给你q个询问,和一个队列容量f 询问有两种操作: 0.访问 ...

  7. 牛客多校第四场 F Beautiful Garden

    链接:https://www.nowcoder.com/acm/contest/142/F来源:牛客网 题目描述 There's a beautiful garden whose size is n ...

  8. 牛客多校第四场 G Maximum Mode

    链接:https://www.nowcoder.com/acm/contest/142/G来源:牛客网 The mode of an integer sequence is the value tha ...

  9. 2019牛客多校第四场 I题 后缀自动机_后缀数组_求两个串de公共子串的种类数

    目录 求若干个串的公共子串个数相关变形题 对一个串建后缀自动机,另一个串在上面跑同时计数 广义后缀自动机 后缀数组 其他:POJ 3415 求两个串长度至少为k的公共子串数量 @(牛客多校第四场 I题 ...

随机推荐

  1. spring源码-国际化-3.5

    一.国际化在实际代码中是非常常见的一中方式.为了结合web做一下语言上面的切换,而达到展示的目的. 二.这里呢,主要是介绍spring中对于国际化做了哪些处理. 三.实现方式 1)xml配置 < ...

  2. Linux 下获取通讯IP

    #!/bin/sh # filename: get_net.sh default_route=$(ip route show) default_interface=$() address=$(ip a ...

  3. [SHELL]结构化命令之条件语句

    1.if-then语句  #!/bin/bash username="root" if grep $username /etc/passwd then echo "the ...

  4. java学习笔记-9.违例差错控制

      1.违例规范是告诉程序员这个方法可能抛出哪些类型的异常.他的格式在方法声明中,位于自变量(参数)列表的后面,如void f() throws tooBig, tooSmall, divZero { ...

  5. Js全反选DataGrid

    // **************************************************************** // // function Trim(value) // -- ...

  6. [git] Git in Practice

    Work flow with git and github Work with Remotes Check the current status git status Check the latest ...

  7. net::ERR_ABORTED ,引入js文件出现报错的解决方法

    在head头里面添加 <mvc:annotation-driven enable-matrix-variables="true"></mvc:annotation ...

  8. 软件工程 speedsnail 第二次冲刺9

    20150526 完成任务:划线的优化,速度和谐: 遇到问题: 问题1 速度仍然不满意 解决1 未解决 明日任务: 蜗牛碰到线后速度方向的调整:(做优化)

  9. Microsoft.Practices.EnterpriseLibrary

    项目中使用了Microsoft.Practices.EnterpriseLibrary这个东西,根据名字猜测和微软有关系(可以翻译为:微软实践企业库). 看到了引入了两个命名空间: using Mic ...

  10. OSG学习:多重纹理映射

    #include<osgViewer\Viewer> #include<osg\Node> #include<osg\Geode> #include<osg\ ...