「JSOI2010」排名

传送门

看到先后顺序限制和字典序,很容易想到拓扑排序 + 贪心。

考虑具体做法:

对于第一问:

我们开一个大根堆来代替队列,然后从大到小构造出各个元素的排名。

我们连边 \(i \to a_i\) ,表示 \(i\) 要在 \(a_i\) 后面,也就是满足 \(a_i\) 在 \(i\) 前面。

然后我们拓扑排序的时候每次取出的都是当前编号最大的并把它放在后面,也就满足了字典序尽量小的原则。

对于第二问:

我们还是考虑用堆来代替队列,但此时是要使得字典序尽量大,所以我们改为连边 \(a_i \to i\) ,然后从小到大构造排名即可。

(p.s. 但是这题数据好奇怪啊,我一开始在第二问的拓扑排序里面,写成每个节点直接往堆里丢,居然也过了???)

参考代码:

#include <cstring>
#include <cstdio>
#include <queue>
#define rg register
#define file(x) freopen(x".in", "r", stdin), freopen(x".out", "w", stdout)
using namespace std;
template < class T > inline void read(T& s) {
s = 0; int f = 0; char c = getchar();
while ('0' > c || c > '9') f |= c == '-', c = getchar();
while ('0' <= c && c <= '9') s = s * 10 + c - 48, c = getchar();
s = f ? -s : s;
} const int _ = 2e5 + 5; int tot, head[_]; struct Edge { int ver, nxt; } edge[_];
inline void Add_edge(int u, int v) { edge[++tot] = (Edge) { v, head[u] }, head[u] = tot; } int n, a[_], dgr[_], rank, ans[_];
priority_queue < int > Q; inline void solve1() {
for (rg int i = 1; i <= n; ++i) if (a[i] != 0) Add_edge(i, a[i]), ++dgr[a[i]];
for (rg int i = 1; i <= n; ++i) if (dgr[i] == 0) Q.push(i);
rank = n;
while (!Q.empty()) {
int u = Q.top(); Q.pop(), ans[u] = rank--;
for (rg int i = head[u]; i; i = edge[i].nxt) if (!--dgr[edge[i].ver]) Q.push(edge[i].ver);
}
for (rg int i = 1; i <= n; ++i) printf("%d%c", ans[i], " \n"[i == n]);
} inline void solve2() {
tot = 0, memset(head, 0, sizeof head);
for (rg int i = 1; i <= n; ++i) if (a[i] != 0) Add_edge(a[i], i), ++dgr[i];
for (rg int i = 1; i <= n; ++i) if (dgr[i] == 0) Q.push(i);
rank = 1;
while (!Q.empty()) {
int u = Q.top(); Q.pop(), ans[u] = rank++;
for (rg int i = head[u]; i; i = edge[i].nxt) if (!--dgr[edge[i].ver]) Q.push(edge[i].ver);
}
for (rg int i = 1; i <= n; ++i) printf("%d%c", ans[i], " \n"[i == n]);
} int main() {
#ifndef ONLINE_JUDGE
file("cpp");
#endif
read(n);
for (rg int i = 1; i <= n; ++i) read(a[i]);
solve1();
solve2();
return 0;
}

「JSOI2010」排名的更多相关文章

  1. 「JSOI2010」挖宝藏

    「JSOI2010」挖宝藏 传送门 由于题目中说道挖一个位置的前提是挖掉它上面的三个,以此类推可以发现,挖掉一个点就需要挖掉这个点往上的整个倒三角,那么也就会映射到 \(x\) 轴上的一段区间(可以发 ...

  2. 「JSOI2010」找零钱的洁癖

    「JSOI2010」找零钱的洁癖 传送门 个人感觉很鬼的一道题... 首先我们观察到不同的数最多 \(50\) 个,于是考虑爆搜. 但是这样显然不太对啊,状态数太多了. 然后便出现了玄学操作: \(\ ...

  3. 「JSOI2010」旅行

    「JSOI2010」旅行 传送门 比较妙的一道 \(\text{DP}\) 题,思维瓶颈应该就是如何确定状态. 首先将边按边权排序. 如果我们用 \(01\) 串来表示 \(m\) 条边是否在路径上, ...

  4. LG4171/BZOJ1823 「JSOI2010」满汉全席 2-SAT

    问题描述 LG4171 BZOJ1823 题解 显然,每个评委对每个材料的满式/汉式要求是对\(n\)个元素的\(0,1\)取值限制. 显然想到\(\mathrm{2-SAT}\) 于是就可以切掉了. ...

  5. 「JSOI2010」满汉全席

    前言 由于蒟蒻才刚开始学 \(\text{2-SAT}\),所以题解中有的地方可能不够精炼,望多包涵! 题目描述 题目意思很简单,标准的\(\text{2-SAT}\)问题模型.那么我们就先来介绍一下 ...

  6. LOJ #6432. 「PKUSC2018」真实排名(组合数)

    题面 LOJ #6432. 「PKUSC2018」真实排名 注意排名的定义 , 分数不小于他的选手数量 !!! 题解 有点坑的细节题 ... 思路很简单 , 把每个数分两种情况讨论一下了 . 假设它为 ...

  7. LibreOJ2241 - 「CQOI2014」排序机械臂

    Portal Description 给出一个\(n(n\leq10^5)\)个数的序列\(\{a_n\}\),对该序列进行\(n\)次操作.若在第\(i\)次操作前第\(i\)小的数在\(p_i\) ...

  8. 「JSOI2014」学生选课

    「JSOI2014」学生选课 传送门 看到这题首先可以二分. 考虑对于当前的 \(mid\) 如何 \(\text{check}\) 我们用 \(f_{i,j}\) 来表示 \(i\) 对 \(j\) ...

  9. iOS 9,为前端世界都带来了些什么?「译」 - 高棋的博客

    2015 年 9 月,Apple 重磅发布了全新的 iPhone 6s/6s Plus.iPad Pro 与全新的操作系统 watchOS 2 与 tvOS 9(是的,这货居然是第 9 版),加上已经 ...

随机推荐

  1. 虚拟函数是否应该被声明仅为private/protected?

    问题导入 我想对于大家来说,虚拟函数并不能算是个陌生的概念吧.至于怎么样使用它,大部分人都会告诉我:通过在子类中重写(override)基类中的虚拟函数,就可以达到OO中的一个重要特性——多态(pol ...

  2. Winform遍历窗口的所有控件(几种方式实现)

    本文链接:https://blog.csdn.net/u014453443/article/details/85088733 扣扣技术交流群:460189483 C#遍历窗体所有控件或某类型所有控件 ...

  3. git之路

    1.如何clone代码到本地 答:git clone https://github.com/antirez/redis.git 2.

  4. Java进阶学习(5)之设计原则(下)

    框架加数据 把数据的硬编码尽可能解成框架加数据的结构 城堡游戏修改后的代码 Room类 package com.castle; import java.util.HashMap; public cla ...

  5. OBS_Classic经典版框架

    一,简介 OBS(open boardcast server),是一个用于直播的开源软件. 官方网站:https://obsproject.com/ 代码托管地址:https://github.com ...

  6. 【深入HTTP协议】

    目录 HTTP 请求 HTTP 响应 "HTTP是(Hyper Text Transfer Protocol)超文本传输协议的缩写. HTTP的发展是万维网协会(World Wide Web ...

  7. WKWebView 使用的坑

    WKWebView 简介: WKWebView 是苹果在 WWDC 2014 上推出的新一代 webView 组件,用以替代 UIKit 中笨重难用.内存泄漏的 UIWebView.WKWebView ...

  8. pwnable.kr-cmd1-Writeup

    MarkdownPad Document *:first-child { margin-top: 0 !important; } body>*:last-child { margin-botto ...

  9. UseIIS

    asp.net core webapi的program.cs 文件中,要加上 使用IIS进程内,可以大幅提高处理速度

  10. 解决docker: error pulling image configuration: Get https://registry-1.docker.io/v2/library/mysql/: TLS handshake timeout.

    出现这个问题,一般的原因是无法连接到 docker hub,通过: systemctl stop docker echo "DOCKER_OPTS=\"\$DOCKER_OPTS ...