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题 ...
随机推荐
- JavaSE打开windows文件
第一个参数表示用什么程序打开,第二个参数表示文件的路径 例一: //用记事本打开d:/test.txt文件 Process p = java.lang.Runtime.getRuntime().exe ...
- js 去掉下划线,后首个字母变大写
1.驼峰转连字符: var s = "fooStyleCss"; s = s.replace(/([A-Z])/g,"-$1").toLowerCase(); ...
- JS中String对象常用的方法
1. stringObject.charAt(index) 参数:index 必需,即字符在字符串中的下标. 返回值: 返回在指定位置的字符.返回的字符是长度为 1的字符串.(length属性 ...
- 「日常训练」Kefa and Dishes(Codeforces Round #321 Div. 2 D)
题意与分析(CodeForces 580D) 一个人有\(n\)道菜,然后要点\(m\)道菜,每道菜有一个美味程度:然后给你了很多个关系,表示如果\(x\)刚好在\(y\)前面做的话,他的美味程度就会 ...
- Jenkis 无法下载插件问题解决
在新机器上安装jenkins后,安装插件报如下错误 sun.security.provider.certpath.SunCertPathBuilderException: unable to find ...
- 【outPut_Class 输出类】使用说明
对象:outPut 说明:定义输出结果类的相关操作.此对象的核心是[JSON]类,所以它继承了[JSON]类的所有方法 重要: 输出结果样式为XML时,自带根节点"root".输出 ...
- python基本数据类型——元组
元组 元组是一种不可变的序列,创建后不可以修改元素值 # 创建只包含一个元素的元组 >>a = (3,) >>print(a) (3,) #使用 tuple() 转换为元组 & ...
- scatter注记词2
couch ranch bind ski extra bring note embrace tape they stick legend
- Spring 3整合Quartz 2实现定时任务:动态添加任务
先展示一下后台管理定时任务效果图: 1.新增任务页面: 2.列表页(实现任务的禁用启用) 3.数据库脚本: -- ------------------------------ Table struct ...
- “Hello World!团队”Alpha发布—视频链接+文案+美工
视频链接:http://v.youku.com/v_show/id_XMzEyNjc2MTAyOA==.html?sharefrom=iphone&sharekey=5378037f8b710 ...