2018牛客多校第四场 J.Hash Function
题意:
给出一个已知的哈希表。求字典序最小的插入序列,哈希表不合法则输出-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的更多相关文章
- 牛客多校第四场 J.Hash Function(线段树优化建图+拓扑排序)
题目传送门:https://www.nowcoder.com/acm/contest/142/J 题意:给一个hash table,求出字典序最小的插入序列,或者判断不合法. 分析: eg.对于序列{ ...
- 2019牛客多校第四场J free——分层图&&最短路
题意 一张无向图,每条边有权值,可以选择不超过 $k$ 条路使其权值变成0,求 $S$ 到 $T$ 的最短路.(同洛谷 P4568) 分析 首先,分层图最短路可以有效解决这种带有 「阶段性」的最短路, ...
- 牛客多校第四场 J Free 最短路
题意: 求最短路,但是你有k次机会可以把路径中某条边的长度变为0. 题解: 跑k+1次迪杰斯特拉,设想有k+1组dis数组和优先队列,第k组就意味着删去k条边的情况,每次松弛操作,松弛的两点i,j和距 ...
- 2019牛客多校第四场J free 最短路
free 题意 给出一个带权联通无向图,你需要从s走到t,你可以选择k条变让他们的权值为0问从s到t的最小权值是多少? 分析 思考一下,如果不带k条白嫖这个条件,那么这就是一个简单的dji就搞定了,我 ...
- 牛客多校第四场sequence C (线段树+单调栈)
牛客多校第四场sequence C (线段树+单调栈) 传送门:https://ac.nowcoder.com/acm/contest/884/C 题意: 求一个$\max {1 \leq l \le ...
- 牛客多校第3场 J 思维+树状数组+二分
牛客多校第3场 J 思维+树状数组+二分 传送门:https://ac.nowcoder.com/acm/contest/883/J 题意: 给你q个询问,和一个队列容量f 询问有两种操作: 0.访问 ...
- 牛客多校第四场 F Beautiful Garden
链接:https://www.nowcoder.com/acm/contest/142/F来源:牛客网 题目描述 There's a beautiful garden whose size is n ...
- 牛客多校第四场 G Maximum Mode
链接:https://www.nowcoder.com/acm/contest/142/G来源:牛客网 The mode of an integer sequence is the value tha ...
- 2019牛客多校第四场 I题 后缀自动机_后缀数组_求两个串de公共子串的种类数
目录 求若干个串的公共子串个数相关变形题 对一个串建后缀自动机,另一个串在上面跑同时计数 广义后缀自动机 后缀数组 其他:POJ 3415 求两个串长度至少为k的公共子串数量 @(牛客多校第四场 I题 ...
随机推荐
- 海思NB-IOT的RA功能
就带ReleaseAssistance标志的特殊发送指令,发送数据的时候会向网络侧请求立即释放RRC进入Idle态. 降低20秒50mA连接态的能量消耗.
- mysql 优化笔记
数据表总共81万条数 SQL explain ); 执行时间超级长,没有等到执行完成就终止了太慢了 explain一下 发现表bb 的select_type 为DEPENDENT SUBQUERY ...
- Android事件分发机制浅析(1)
本文来自网易云社区 作者:孙有军 事件机制是Android中一个比较复杂且重要的知识点,比如你想自定义拦截事件,或者某系组件中嵌套了其他布局,往往会出现这样那样的事件冲突,坑爹啊!!事件主要涵盖onT ...
- Ajax中post请求和get请求的区别
首先提出两点Post比Get大的不同地方 1.post请求浏览器每次不会缓存,每次都会重新请求,而get请求不要缓存的时候,需要手动设置 写上xhr.setRequestHeader("If ...
- selenium自动追踪微信小程序审核方案
小程序随着腾讯的不断推广,变的越来越普及,同时更新迭代的速度也越来越快,种类越来越多,那么在如何保证时效性就显得尤为重要,其中很重要一个环节就在于小程序审核通过之后,能否立刻通知到相关技术人员进行发布 ...
- TPO-15 C1 The campus newspaper's reporter position
TPO-15 C1 The campus newspaper's reporter position 第 1 段 1.Listen to a conversation between a Studen ...
- 基于 CPython 解释器,为你深度解析为什么Python中整型不会溢出
前言 本次分析基于 CPython 解释器,python3.x版本 在python2时代,整型有 int 类型和 long 长整型,长整型不存在溢出问题,即可以存放任意大小的整数.在python3后, ...
- 【icon】 图标组件说明
小程序默认了几种类型图标,其组件原型如下: <icon type="[success | success_no_circle | info | warn | waiting | can ...
- DNA序列 (DNA Consensus String,ACM/ICPC Seoul 2006,UVa1368
题目描述:算法竞赛入门经典习题3-7 题目思路:每列出现最多的距离即最短 #include <stdio.h> #include <string.h> int main(int ...
- Docker 镜像构建的时候,应该小心的坑
不要改文件 如果run了以后,你还需要进入到容器中,修改容器的配置,那么,这个容器是危险的.一旦容器无法启动,就再也改不了配置.那么你就需要删除和重新run这个容器,而配置要再改一遍.一个可用的镜像在 ...