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题 ...
随机推荐
- macOS 10.13 High Sierra PHP开发环境配置
命令:sudo rm /usr/local/mysql sudo rm -rf /usr/local/mysql* sudo rm -rf /Library/StartupItems/MySQLCOM ...
- iOS 测试工具reveal可视化调试工具的使用
简单翻译一下reveal可视化图形工具插入项目的官方文档(官方英文版file:///Applications/Reveal.app/Contents/SharedSupport/Documentati ...
- 金山注入浏览器默认开启上网导航 www.uu114.cn
金山注入浏览器默认开启上网导航 www.uu114.cn 今天突然发现我的电脑所有浏览器打开后,都会默认打开一个www.uu114.cn网站,chrome.firefox和IE都中招了.经过排查,发现 ...
- ansible基础配置使用(一)
test test test
- WEB安全基础之sql注入基础
1.基础sql语句 注释 单行注释# %23--+ --加空格多行注释/**/ SELECT(VERSION()) SELECT(USER()) SELECT(database()) 查数据库 SEL ...
- 第一章 了解TCP/IP协议族
第一章 了解TCP/IP协议族 1.1 TCP/IP协议族体系结构以及主要协议 IP和TCP协议对编写程序具有最直接的影响,后面的章节会详细的讲到. TCP/IP的体系结构有应用层,传输层,网络层,数 ...
- 【wx:for】小程序列表渲染的使用说明
wx:for 控制属性绑定一个数组,即可使用数组中各项的数据重复渲染该组件. 默认数组的当前项的下标变量名默认为 index,数组当前项的变量名默认为 item,即: {{index}} . {{it ...
- TW实习日记:第13天
昨天困扰的问题终于解决了.因为是百度地图api提供的函数,所以这个解决办法并不适用于所有异步请求,仅仅针对百度地图api的调用接口函数和回调函数.有两种解决方法可以解决百度地图api中常出现的请求回调 ...
- GET请求的写法-jmeter
第一种写法:可以向post 请求一样写 第二种写法: /pinter/com/getSku?id=${__Random(1,100,rdmNum)}
- sparkML原始数据转换成label-features方法
数据1:kaggle-旧金山犯罪分类数据 格式如下: Dates,Category,Descript,DayOfWeek,PdDistrict,Resolution,Address,X,Y -- :: ...