题目链接:戳这里

学习博客:戳这里

题意:

有n个空位,给一个数x,如果x%n位数空的,就把x放上去,如果不是空的,就看(x+1)%n是不是空的。

现在给一个已经放过数的状态,求放数字的顺序。(要求字典序最小

解题思路:

用一个优先队列。如果序列里的x的位子就是x%n,证明这个数是最开始就放好的。加入优先队列。

每次出一个最小元素。把它填入位子a,然后用并查集把a和a+1合并,看看现在a的祖先能不能被加入队列。

用优先队列维护很容易想到,关键是怎么维护选出的数的位置,这里用并查集建边很巧妙的解决了这个问题。


附ac代码:

 1 #include<iostream>
2 #include<algorithm>
3 #include<stdio.h>
4 #include<string.h>
5 #include<string>
6 #include <cmath>
7 #include <vector>
8 #include <queue>
9 using namespace std;
10 typedef long long ll;
11 const ll mod = 1e9 + 7;
12 const int maxn = 2e6 + 10;
13 int pre[maxn];
14 int nu[maxn];
15 int ans[maxn];
16 bool vis[maxn];
17
18 struct nod
19 {
20 int pos;
21 int val;
22 nod(){};
23 nod(int x, int y)
24 {
25 pos = x;
26 val = y;
27 }
28 bool friend operator < (nod a, nod b)
29 {
30 return a.val > b.val;
31 }
32
33 };
34 void init(int n)
35 {
36 for(int i = 0; i <= n; ++i)
37 pre[i] = i;
38 }
39 int find(int x)
40 {
41 if(pre[x] == x) return x;
42 else return pre[x] = find(pre[x]);
43 }
44 int main()
45 {
46 int t;
47 scanf("%d", &t);
48 int n;
49 while(t--)
50 {
51 int cnt = 0;
52 int len = 0;
53 scanf("%d", &n);
54
55 priority_queue<nod>q;
56 memset(vis, 0, sizeof(vis));
57 init(n);
58 for(int i = 0; i < n; ++i)
59 {
60 scanf("%d", &nu[i]);
61 }
62 for(int i = 0; i < n; ++i)
63 {
64 if(nu[i] == -1) continue;
65 ++cnt;
66 if(nu[i] % n == i)
67 {
68 q.push(nod(i, nu[i]));
69 vis[i] = 1;
70 }
71 }
72
73 while(!q.empty())
74 {
75 nod u = q.top(); q.pop();
76 ans[++len] = u.val;
77 int to = pre[find(u.pos)] = find((u.pos + 1) % n);
78 if(vis[to] || nu[to] == -1 || find(nu[to]%n) != to) continue;
79 q.push(nod(to, nu[to]));
80 vis[to] = 1;
81 }
82 if(len != cnt)
83 {
84 puts("-1");
85 continue;
86 }
87
88 for(int i = 1; i <= len; ++i)
89 {
90 if(i > 1) printf(" ");
91 printf("%d", ans[i]);
92 }
93 printf("\n");
94 }
95 }

牛客网多校第4场 J Hash Function 【思维+并查集建边】的更多相关文章

  1. 牛客网多校训练第一场 J - Different Integers(树状数组 + 问题转换)

    链接: https://www.nowcoder.com/acm/contest/139/J 题意: 给出n个整数的序列a(1≤ai≤n)和q个询问(1≤n,q≤1e5),每个询问包含两个整数L和R( ...

  2. 牛客网多校第7场 J Sudoku Subrectangles 【构造】

    题目:戳这里 题意:给一个n*m的矩阵,里面由a~z及A~Z构成,问有多少个子矩阵满足任意一行或一列中都没有相同的字母. 解题思路:左上角和右下角两点可以确定一个矩阵.可以先预处理出来每个点作为一个矩 ...

  3. 牛客网多校第5场 F take 【思维+数学期望】

    题目:戳这里 思路来源:视频讲解 题意:有n个箱子按1...n标号,每个箱子有大小为di的钻石概率为pi,我们初始有个大小为0的钻石,从1到n按顺序打开箱子,遇到比手中大的箱子就换,求交换次数的数学期 ...

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

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

  5. 牛客网多校第3场C-shuffle card 平衡树或stl(rope)

    链接:https://www.nowcoder.com/acm/contest/141/C 来源:牛客网 题目描述 Eddy likes to play cards game since there ...

  6. 牛客网多校第3场Esort string (kmp)

    链接:https://www.nowcoder.com/acm/contest/141/E 来源:牛客网 题目描述 Eddy likes to play with string which is a ...

  7. 牛客网多校赛第九场A-circulant matrix【数论】

    链接:https://www.nowcoder.com/acm/contest/147/A 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524 ...

  8. 牛客网多校训练第二场D Kth Minimum Clique

    链接:https://ac.nowcoder.com/acm/contest/882/D来源:牛客网 Given a vertex-weighted graph with N vertices, fi ...

  9. 牛客网多校第5场 H subseq 【树状数组+离散化】

    题目:戳这里 学习博客:戳这里 题意:给n个数为a1~an,找到字典序第k小的序列,输出该序列所有数所在位置. 解题思路:先把所有序列预处理出来,方法是设一个数组为dp,dp[i]表示以i为开头的序列 ...

随机推荐

  1. 【七天搞定Python】day01.Python环境配置、pip、IDE、注释、变量,数据类型、标识符/关键字、输出、输入

    什么是Python? 动态解释型语言,1982年由荷兰人Guido von Rossum发明. 更多细节可以google,这里不做展开. Python解释器: CPython(官方版本C语言实现) I ...

  2. C# ADO.NET连接字符串详解

    C#中连接字符串包含以下内容 参数 说明 Provider 设置或者返回提供的连接程式的名称,仅用于OLeDbConnection对象 Connection Timeout 在终止尝试并产生异常前,等 ...

  3. Vue MVVM模型原理

    最近反思了下自己,觉得自己很急躁,学技术总是觉得能用就行了,其实这样很不好,总是这样,就永远只能当用轮子的人.好了,废话不多说,转入正题: 要理解MVVM的原理,首先要理解它是什么,怎么运作起来的: ...

  4. Gradle使用及配置

    构建工具:Gradle(6.8) 下载地址:https://gradle.org/releases/ 下载最新版的二进制文件即可,下载"gradle-6.8.1-bin.zip文件,下载后完 ...

  5. Vue中组件间通信的方式

    Vue中组件间通信的方式 Vue中组件间通信包括父子组件.兄弟组件.隔代组件之间通信. props $emit 这种组件通信的方式是我们运用的非常多的一种,props以单向数据流的形式可以很好的完成父 ...

  6. TCP/IP建立连接的时候ISN序号分配问题

    初始建立TCP连接的时候的系列号(ISN)是随机选择的,那么这个系列号为什么不采用一个固定的值呢?主要有两方面的原因 防止同一个连接的不同实例(different instantiations/inc ...

  7. 算法总结篇---字典树(Trie)

    目录 写在前面 具体实现 引例: 引例代码: 例题 Phone List Solution: The XOR Largest Pair Solution L语言 Solution: 写在前面 字典树是 ...

  8. loj10012 Best Cow Fences

    题目描述 原题来自:USACO 2003 Mar. Green 给定一个长度为 N 的非负整数序列 A ,求一个平均数最大的,长度不小于 L 的子段. 输入格式 第一行用空格分隔的两个整数 N 和 L ...

  9. Cmder的findstr问题

    在环境变量中加入C:\windows\system32即可

  10. SpringCloud配置中心实战

    SpringCloud配置中心实战 1.统一配置中心(Config) 1.1 Spring项目配置加载顺序 1.2 配置规则详解 1.3 Git仓库配置 1.3.1 使用占位符 1.3.2 模式匹配 ...